设置Azure ACS角色

时间:2013-03-13 01:08:50

标签: azure visual-studio-2012 roles identity acs

嘿,伙计们不确定这是否是正确的论坛,但我最终想要解决这个问题。

快速了解我正在尝试做的事情。我正在为我的大学高级项目工作,它实际上是在微软,但我的webforms应用程序已经完成,我正在尝试使用一些基于角色的识别来设置ACS。我正在使用VS 2012,我已经让ACS正常使用Windows Live Id和Google登录。当我试图将整个应用仅限制为管理员用户时,我的问题就来了。我在网上看过很多教程,但它们似乎都与VS 2010有很大的不同。我的问题尤其在于我无法查看Windows live id让我从中扮演角色的nameidentifier。它在天蓝色。因此,例如,如果someone@live.com登录,我可以返回nameidentifier =“x”,然后从该nameidentifier中创建一个角色。我似乎无法查看nameidentifier?

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

非常感谢任何帮助!

我也看过很多来自@AntonStaykov的作品,但不是我想要的,如果你也在这里帮助我会非常感激。

3 个答案:

答案 0 :(得分: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”作为值。
  4. 这是你的目标吗?如果是这样,执行此操作的位置在ClaimsAuthenticationManager中。

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

    -Rick

答案 1 :(得分:1)

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

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

  1. 设置system.web部分中仅授予Administrator角色访问权限的授权规则
  2. 在ACS中设置声明规则,以根据某些输入条件生成Administrator角色声明。
  3. 第一步非常简单,只需在system.web文件的web.config部分添加以下内容:

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

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

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

    1. 选择规则的身份提供商(让我们假设Google)
    2. 选择输入声明类型为:http://schemas.xmlsoap.org/claims/EmailAddress
    3. 输入索赔值:your_desired_admin@gmail.com(管理员的电子邮件地址)
    4. 选择输出声明类型为:http://schemas.microsoft.com/ws/2008/06/identity/claims/role
    5. 输入输出声明的值:Administrator
      1. 为规则设置正确的说明,例如your_desired_admin@gmail.com is Administrator
    6. 保存规则。
    7. 完成。对要为其授予管理员权限的所有人员重复此步骤。当然,您只能为将提供E-mail Address的身份提供商执行此操作。对不起,Microsoft帐户用户。

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

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

      而且,正如您可以想象的那样,您无法猜测来自Live ID的任何用户的NIC。为Live ID启用此方案需要更复杂的逻辑。我没有时间和空间在这里描述,但我可能会找一个好的博客文章。

      您可以按照Rick已经指出的那样在您的应用程序逻辑上获取NameIdentifier声明,但是您真的想要给所有用户和任何用户“管理员”角色吗?另外,对于每一次登录,我都会离开我的应用程序,搞乱ACS中的规则。有更好的方法来实现你想要的东西(正如我所说,博客的时间)。

答案 2 :(得分:0)

如果您的目标是.NET Framework 4.5,那么VS 2012中的工具确实不同。其中很大一部分原因是Windows Identity Foundation内置于4.5中的框架中。因此,如果您只针对.NET Framework 4.0,则可以消除一些摩擦。有了这个,您将获得与您所引用的教程类似的体验(假设这些教程以.NET 4.0或更早版本为目标)。

我不确定为什么你无法查看nameidentifier。也许你可以围绕这个问题提供更多的背景知识?例如,您是在ACS门户,代码等吗?

-Rick