您遇到的主要问题是使用 Live ID(或者,他们现在称之为 - Microsoft 帐户)。如果您只使用 ACS,则无法从 Live ID 中获取用户的电子邮件。我个人喜欢 ACS 并使用它,我只是不关心 Microsoft 帐户,或以其他方式处理它。
如果您只想限制管理员访问整个应用程序,您必须完成两件事:
- 在您的
system.web 部分设置授权规则,仅授予对 Administrator 角色的访问权限
- 在 ACS 中设置声明规则以根据某些输入标准生成
Administrator 角色声明。
第一步相当简单,只需在web.config 文件的system.web 部分添加以下内容:
<authorization>
<allow roles="Administrator" />
<deny users="?" />
</authorization>
只需确保您的 web.config 中没有其他 authorization 部分!
第二步,简单的部分。
转到您的 ACS 管理门户,然后转到分配给您的依赖方应用程序的规则组。并添加具有以下条件的新规则:
- 为规则选择身份提供者(假设是 Google)
- 选择输入声明类型为:
http://schemas.xmlsoap.org/claims/EmailAddress
- 输入声明值:
your_desired_admin@gmail.com(管理员的电子邮件地址)
- 选择输出声明类型为:
http://schemas.microsoft.com/ws/2008/06/identity/claims/role
- 输入输出声明的值:
Administrator
- 为规则设置适当的描述,例如
your_desired_admin@gmail.com is Administrator。
- 保存规则。
完成。对您要授予管理员权限的所有人员重复此步骤。当然,您只能对可以为您提供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 中的规则。有更好的方法来实现你想要的(正如我所说,是时候写博客了)。