2013-03-13 145 views
0

嘿家伙不知道这是否是合适的论坛,但我在我的智慧结束试图弄清楚这一点。设置Azure ACS角色

所以我想要做的快速背景。我正在为我的大学项目工作,实际上是与微软合作,但是我的webforms应用程序已经完成了,我正在尝试使用一些基于角色的身份验证来设置ACS。我正在使用VS 2012,并且我已经使ACS能够正常使用Windows Live ID和Google登录。当我试图将整个应用仅限于管理员的用户时,我的问题就出现了。我在网上看过很多教程,但他们似乎都在VS 2010中,这与2012年有很大不同。我的问题在于,我无法查看Windows Live ID为我提供角色的名称标识它在天蓝色。因此,举例来说,如果[email protected]登录,我可以取回nameidentifier =“x”,然后从该名称标识中删除角色。我似乎无法查看名称标识符?

有没有人有任何知识如何让这个工作在VS 12或有任何教程?或者如果有人知道我以不同的方式解释我的解释,我将不胜感激!

任何帮助,非常感谢!

另外我见过很多来自@AntonStaykov的作品,但并不是我在找的东西,如果你也在这里以及协助我会非常感激。

回答

2

下面介绍如何在代码中访问nameidentifier声明。这假定你有ACS默认设置的透传声明。

 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. 查询(字典,坚持商店,供应商等),看看是否用户是一个基于您自己的逻辑的管理员,
  3. 以“Admin”作为值向主体添加角色声明。

这是你的目标吗?如果是这样,那么执行此操作的地方位于ClaimsAuthenticationManager中。

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

-Rick

0

如果您的目标是.NET Framework 4.5,那么VS 2012中的工具确实不同。其中很大一部分是由Windows身份基础内置于4.5中的框架所驱动的。所以,如果您只是针对.NET Framework 4.0,您可能会消除一些摩擦。有了这个,你也会对你所指的教程有类似的体验(假设这些教程的目标是.NET 4.0或更早版本)。我不确定你为什么不能查看名称标识符。也许你可以提供更多关于这个问题的背景吗?例如,你在ACS门户,代码等?

-Rick

+0

所以基本上我想要做的是如果有人使用Windows Live ID登录... [email protected]他们产生一个nameidentifier =“x”我希望能够看到代码中的名称标识符是什么这样我就可以将该输出作为acs中的一个要求并命名角色admin。理论上我需要为每个用户都这样做。除非有一些解决这个问题的方法,否则就容易得多。总之,我希望有一定数量的用户能够访问我的网络表单应用程序,因为它仅供管理员使用 – 2013-03-13 02:36:40

1

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

如果要限制访问整个应用程序只为管理员,你必须完成两两件事:

  1. 设置的授权规则在system.web节只Administrator角色
  2. 设置索赔提供访问根据一些输入标准,ACS中的规则可以生成Administrator角色声明。

第一步是相当容易,只需添加您system.web段内按照您的web.config文件:

<authorization> 
    <allow roles="Administrator" /> 
    <deny users="?" /> 
</authorization> 

只要确保没有其他authorization部分在你的web.config!

第二步,简单的部分。 转到您的ACS管理门户,然后转到分配给您的信赖方应用程序的规则组。并添加新的规则如下标准:

  1. 选择了该规则的身份提供商(假设谷歌)
  2. 选择输入声明类型为:http://schemas.xmlsoap.org/claims/EmailAddress
  3. 输入索赔值:[email protected](中管理员的电子邮件地址)
  4. 选择输出声明类型为:Administrator
      http://schemas.microsoft.com/ws/2008/06/identity/claims/role
    1. 的输出要求输入值
    2. 为规则设置正确的描述,类似[email protected] is Administrator
  5. 保存规则。

完成。为所有想要授予管理员权限的人重复此步骤。当然,你只能为身份提供者这样做,它会给你。对于Microsoft帐户用户很抱歉。

当Microsoft帐户持有者通过Azure ACS来访问管理员权限时,没有简单的方法。你拥有的唯一的东西是一个名称标识符索赔,或http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier(我将其称为NIC为简单起见

NIC是以下组合独特:。User Identity ([email protected]) + ACS NameSpace + Relying Party Application这意味着,如果[email protected]造访您应用程序通过mygreat.accesscontrol.windows.net您将获得该用户的唯一NIC。如果同一用户通过someother.accesscontrol.windows.net登录我的网站,我将获得全新的NIC,这将再次在全球范围内唯一,但不会与一个你的应用得到了。

而且,你可以im agine,你不能为来自Live ID的任何用户猜测NIC。为Live ID启用此方案需要更复杂的逻辑。我没有时间和空间在这里描述,但我可能会找到一个好的博客文章的时间。

您可以在您的应用程序逻辑中获得NameIdentifier声明,正如Rick已经指出的那样,但是您是否真的想为所有用户和任何用户提供“管理员”角色?另外,我会离开我的应用程序,因为每一次登录都会混淆ACS中的规则。有更好的方法来实现你想要的东西(就像我说的,写博客的时间)。

+0

除了我的项目需要我们使用Microsoft Live ID之外,此解决方案非常完美。因为只有管理员能够访问这个应用程序,我希望它是100%的访问权限,或者不需要访问所有类型的安全性。不知道我应该采取什么步骤下一个 – 2013-03-13 22:21:02

+0

好吧,所以只是为了获得一些安全性,我尝试使用谷歌。我不太确定哪些功能无法正常工作,但它允许任何用户使用Gmail。即使我改变了网页配置。有任何想法吗? – 2013-03-14 02:33:47

+0

我对“100%访问或不访问”有点困惑。你的意思是 - 所有的Live ID成员都有管理员权限,或者没有人应该是管理员?正如我所说,你想达到什么是可行的,但不是简单的答案。 – astaykov 2013-03-18 23:35:15