0

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

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

有没有人知道如何让它在 vs 12 中工作或有任何教程?或者,如果有人知道一种方法来做我正在解释的不同方式,我将不胜感激!

任何帮助是极大的赞赏!

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

4

3 回答 3

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

-瑞克

于 2013-03-13T05:03:57.757 回答
1

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

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

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

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

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

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

第二步,简单的部分。转到您的 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的 ,这将再次成为全球唯一的,但与您的应用程序获得的不同。

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

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

于 2013-03-13T10:19:34.217 回答
0

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

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

-瑞克

于 2013-03-13T02:21:20.113 回答