【问题标题】:Setting up Azure ACS roles设置 Azure ACS 角色
【发布时间】:2013-02-28 19:03:18
【问题描述】:

嘿,伙计们,我不确定这是否是正确的论坛,但我正在努力解决这个问题。

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

有没有人知道如何让它在 vs 12 中工作或有任何教程?或者,如果有人知道以不同方式完成我所解释的事情的方法,我将不胜感激!

非常感谢任何帮助!

我还看到了@AntonStaykov 的很多工作,但不是我想要的,如果你也在这里提供帮助,我将非常感激。

【问题讨论】:

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


    【解决方案1】:

    您可以通过以下方式在代码中访问 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

    -瑞克

    【讨论】:

      【解决方案2】:

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

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

      1. 在您的 system.web 部分设置授权规则,仅授予对 Administrator 角色的访问权限
      2. 在 ACS 中设置声明规则以根据某些输入标准生成 Administrator 角色声明。

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

      <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. 保存规则。

      完成。对您要授予管理员权限的所有人员重复此步骤。当然,您只能对可以为您提供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。这意味着如果me@live.com 通过mygreat.accesscontrol.windows.net 登录到您的应用程序,您将获得该用户的唯一NIC。如果同一用户通过someother.accesscontrol.windows.net 登录我的站点,我将获得全新的NIC,这将再次成为全球唯一的,但与您的应用程序获得的不同。

      而且,正如您想象的那样,您无法猜测来自 Live ID 的任何用户的 NIC。为 Live ID 启用此场景需要更复杂的逻辑。我没有时间和篇幅在这里描述,但我可能会找时间写一篇不错的博文。

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

      【讨论】:

      • 这个解决方案是完美的,除了我的项目需要我们使用 Microsoft Live ID。因为只有管理员才能访问这个应用程序,所以我希望它是 100% 访问或在所有类型的安全性下都没有访问权限。不知道下一步我应该采取什么步骤
      • 好的,所以为了提高安全性,我尝试使用谷歌。我不太确定什么不起作用,但它允许任何使用 gmail 的用户进入。即使我更改了网络配置。有什么想法吗?
      • 我对@9​​87654346@ 有点困惑。你的意思是 - 所有 Live ID 成员都有管理员权限,还是没有人是管理员?正如我所说,您想要实现的目标是可行的,但不是简单的 SO 答案的主题。
      • 我的最终目标是只有我通过 ACS 门户指定为管理员的人才能进入。在环顾四周之后,这似乎比应该的要困难得多,因为你不能使用任何东西,但windows live的名称标识符(我让谷歌工作)。知道使用 OAuth 2.0 for windows live 是否可以实现我的目标?
      • 好吧,我认为您的意图 through the ACS portal 在概念上有点错误。我会采取措施避免直接(和手动)使用 Portal to adjust 任何类型的生产服务。不能将 OAuth Live SDK 与 Azure ACS 集成。但是,您可以做的是以 GUID 的形式创建一个 one-time-activation-token,它存在于您的应用程序中。接受所有提供有效安全令牌的用户,但阻止他们并要求one-time-activation-token。如果提供了有效令牌 - 根据 nameidentifier 声明创建本地配置文件,并让该用户以管理员身份进入。
      【解决方案3】:

      如果您的目标是 .NET Framework 4.5,VS 2012 中的工具确实有所不同。其中很大一部分是由 Windows Identity Foundation 内置于 4.5 框架中的事实驱动的。因此,如果您只针对 .NET Framework 4.0,您可能会消除一些摩擦。这样,您将获得与您所参考的教程类似的体验(假设这些教程针对 .NET 4.0 或更早版本)。

      我不确定您为什么无法查看名称标识符。也许您可以围绕该问题提供更多背景信息?例如,您是否在 ACS 门户中、在代码中等?

      -瑞克

      【讨论】:

      • 所以基本上我想要做的是如果有人使用 Windows Live id 登录...someone@live.com 他们产生一个名称标识符 =“x” 我希望能够看到那个名字标识符在代码中,以便我使用该输出作为 acs 中的要求创建一个角色,并将该角色命名为 admin。从理论上讲,我需要为每个用户执行此操作。除非有一些方法可以解决这个问题,否则会容易得多。简而言之,我想要一些我将预先确定的用户能够访问我的网络表单应用程序,因为它仅供管理员使用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      相关资源
      最近更新 更多