首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置Azure ACS角色

设置Azure ACS角色
EN

Stack Overflow用户
提问于 2013-03-13 09:08:50
回答 3查看 772关注 0票数 0

嘿,伙计们,我不确定这是否是合适的论坛,但我正绞尽脑汁试图弄清楚这一点。

所以简单介绍一下我要做的事情。我正在做我的大学毕业项目,实际上是和微软一起做的,但我的webforms应用程序已经完成了,我正在尝试用一些基于角色的标识来设置ACS。我使用的是vs2012,我已经使用windows live Id和Google登录让ACS正常工作了。当我试图将整个应用程序仅限于管理员用户时,我的问题就出现了。我在网上看到了很多教程,但它们似乎都是VS2010的,这与2012年有很大的不同。我的问题尤其在于,我无法查看Windows live id为我提供的nameidentifier,从而无法在azure中发挥作用。例如,如果someone@live.com登录,我可以返回nameidentifier= "x“,然后从该名称标识符中创建一个角色。我似乎找不到查看名称标识符的方法?

有没有人知道如何在VS12中使用它,或者有任何教程?或者,如果有人知道用不同的方式来做我正在解释的事情,我将非常感激!

任何帮助都是非常感谢的!

我也看到了@AntonStaykov的许多作品,但并不完全是我想要的,如果你也在这里协助我,我会非常感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-13 13:03:58

下面是如何在代码中访问nameidentifier声明。这假设您的ACS设置具有默认情况下应该提供的直通声明。

代码语言:javascript
复制
        ClaimsPrincipal p = System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal;

        Claim cNameIdentifier = p.Claims.First(c => c.Type == ClaimTypes.NameIdentifier);
        if (cNameIdentifier != null)
        {
            string NameIdentifierValue = cNameIdentifier.Value;

            // your code here to implement your logic.

        }

我认为你想要的是一种增强(或转换) web应用程序中传入声明的方法,这样你就可以实现基于角色的安全性了。例如,当令牌命中您的站点时,您希望

  1. 检索传入的NameIdentifier声明,在存储(字典、持久化存储、提供程序等)中查找
  2. 要根据您自己的逻辑查看该用户是否为管理员,请使用" Admin“作为值向主体添加一个角色声明。

这是你的目标吗?如果是这样的话,可以在ClaimsAuthenticationManager中执行此操作。

http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthenticationmanager.aspx

-Rick

票数 2
EN

Stack Overflow用户

发布于 2013-03-13 18:19:34

你的主要问题是使用Live ID (或者,他们现在叫它- Microsoft帐户)。如果您只使用ACS,则无法从Live ID中获取用户的电子邮件。我个人喜欢并使用ACS,我只是不关心微软的账号,或者用其他方式处理它。

如果您想限制管理员对整个应用程序的访问,您必须完成两件事:

system.web部分中的

  1. 设置授权规则,该规则仅允许访问ACS中的Administrator role
  2. 设置声明规则,以根据某些输入条件生成Administrator角色声明。

第一步相当简单,只需在web.config文件的system.web部分中添加以下内容:

代码语言:javascript
复制
<authorization>
  <allow roles="Administrator" />
  <deny users="?" />
</authorization>

只需确保您的web.config中没有其他authorization部分!

第二步,简单的部分。转到您的ACS管理门户,然后转到分配给您的依赖方应用程序的规则组。并添加具有以下条件的新规则:

Google)

  • Select为规则选择身份提供者(假设输入声明类型为:http://schemas.xmlsoap.org/claims/EmailAddress

  • Enter Claim值:(输出声明类型的电子邮件地址为:http://schemas.microsoft.com/ws/2008/06/identity/claims/role
  1. Enter输出声明类型的值:Administrator
    1. 为规则设置正确的描述,类似于your_desired_admin@gmail.com is Administrator.

  1. 保存规则。

好了。对要授予管理员权限的所有人员重复此步骤。当然,您只能为将为您提供E-mail Address的身份提供者执行此操作。很抱歉,Microsoft帐户用户。

当Microsoft帐户持有者通过Azure ACS访问时,没有简单的方法可以为他们提供管理员权限。您唯一拥有的就是名称标识符声明,或http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier (为简单起见,我将其称为NIC

NIC在以下组合上是唯一的:User Identity (me@live.com) + ACS NameSpace + Relying Party Application。这意味着如果通过mygreat.accesscontrol.windows.net me@live.com登录到你的应用程序,你将获得该用户的唯一NIC。如果完全相同的用户通过someother.accesscontrol.windows.net登录到我的站点,我将获得完全新的NIC,这将再次是全局唯一的,但不会与您的应用程序获得的不同。

而且,正如你可以想象的,你无法猜测任何来自Live ID的用户的NIC。为Live ID启用这个场景需要更复杂的逻辑。我没有时间和篇幅在这里描述,但我可能会找到时间写一篇很好的博客文章。

正如Rick已经指出的,您可以在应用程序逻辑上获得NameIdentifier声明,但是您真的想为所有用户和任何用户提供“管理员”角色吗?此外,我不会离开我的应用程序,而是为每次登录在ACS中打乱规则。有更好的方法来实现你想要的(正如我所说的,是时候写博客了)。

票数 1
EN

Stack Overflow用户

发布于 2013-03-13 10:21:20

如果你的目标是.NET Framework4.5,那么这个工具在VS2012中确实是不同的。这在很大程度上是由Windows Identity Foundation在4.5中内置到框架中这一事实推动的。因此,如果您只针对.NET Framework4.0,您可能会消除一些摩擦。这样,您也将拥有与您所引用的教程相似的体验(假设这些教程针对的是.NET 4.0或更早版本)。

我不知道为什么您不能查看名称标识符。也许你可以围绕这个问题提供更多的背景信息?例如,您是否在ACS门户中,在代码中,等等?

-Rick

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15375253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档