您遇到的主要问题是使用 Live ID(或者,正如他们现在所说的 - Microsoft 帐户)。如果您只使用 ACS,则无法从 Live ID 中获取用户的电子邮件。我个人喜欢 ACS 并使用它,我只是不关心 Microsoft 帐户,或以其他方式处理它。
如果您只想限制管理员对整个应用程序的访问,您必须完成两件事:
- 在您的部分中设置仅授予角色
system.web
访问权限的授权规则Administrator
Administrator
在 ACS 中设置声明规则以根据某些输入标准生成角色声明。
第一步相当简单,只需system.web
在文件的部分中添加以下内容web.config
:
<authorization>
<allow roles="Administrator" />
<deny users="?" />
</authorization>
只要确保authorization
您的 web.config 中没有其他部分!
第二步,简单的部分。转到您的 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
的 ,这将再次成为全球唯一的,但与您的应用程序获得的不同。
而且,正如您可以想象的那样,您无法猜测NIC
来自 Live ID 的任何用户。为 Live ID 启用此场景需要更复杂的逻辑。我没有时间和空间在这里描述,但我可能会找时间写一篇不错的博客文章。
正如 Rick 已经指出的那样,您可以在您的应用程序逻辑上获得 NameIdentifier 声明,但是您真的想给所有和任何用户“管理员”角色吗?另外,我不会让我的应用程序在每次登录时都弄乱 ACS 中的规则。有更好的方法来实现你想要的(正如我所说,写博客的时间)。