我正在尝试允许用户使用他们的 Google、Facebook 和 Windows Live 帐户登录到 ASP.NET MVC 网站。我目前正在使用 Azure App Fabric ACS,这让它变得非常简单。问题是我需要电子邮件地址。Google 和 Facebook 提供电子邮件作为声明,但 Windows Live 没有。从 LiveConnect 站点看来,使用 wl.basic(获取用户名)和 wl.emails(获取用户的电子邮件地址)范围似乎很容易,但我无法按顺序影响 ACS获取此信息。我还尝试实现 OAuth2 Web 服务器流程,以便在用户登录后从我的站点获取它。我能够获得所需的信息,但我陷入了无限的登录循环,因为 FedAuth cookie 被删除时我重定向到https://oauth.live.com/authorize开始流程。有没有人能够让它工作(在服务器端)?我是否应该完全废弃 ACS 并提供一个自定义页面,使用每个提供商的自定义代码来启用登录?
我用代码改造了以前的演示(博客引擎 ala smarx),这样我就不必暴露任何专有的东西。在我的 web.config FedUtil 中插入了以下内容:
<httpModules>
<add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpModules>
我删除了拒绝所有用户
但是我有一个特定的操作方法(新博客的帖子)强制用户获得授权
[Authorize]
public ActionResult New()
{
var principal = Thread.CurrentPrincipal as IClaimsPrincipal;
if (principal == null)
return new HttpStatusCodeResult(403);
// if this is a Windows Live User we have more work to do
string redirectUrl = CheckForWindowsLiveUser(principal);
if (redirectUrl != null)
{
return Redirect(redirectUrl);
}
在第一次填充 cookie(FedAuth 和 FedAuth1)时的 New 请求中。重定向返回后,它们就消失了。我没有对会话提供者做任何事情(也许我应该)。