将第三方登录集成到您的 ASP.NET 应用程序的 OWIN 中间件非常酷,但我似乎无法弄清楚如何将其从替换蹩脚的 Membership API 的新 ID 框架中删除。我对在基于 EF 的数据持久性中保留生成的声明和用户信息不感兴趣,我只想要声明信息,以便我可以将其应用于现有项目中我自己的用户帐户。我不想仅仅为了利用这些东西而采用新的 ID 框架。
我一直在 CodePlex 上浏览代码,但有很多静态魔法。你能提供什么建议吗?
使用以下代码设置 OWIN 安全中间件:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Application",
AuthenticationMode = AuthenticationMode.Passive,
LoginPath = new PathString("/Login"),
LogoutPath = new PathString("/Logout"),
});
app.SetDefaultSignInAsAuthenticationType("External");
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "External",
AuthenticationMode = AuthenticationMode.Passive,
CookieName = CookieAuthenticationDefaults.CookiePrefix + "External",
ExpireTimeSpan = TimeSpan.FromMinutes(5),
});
app.UseGoogleAuthentication();
上面的代码设置了应用程序cookie、外部cookie和谷歌外部登录中间件。外部登录中间件将外部用户登录数据转换为身份,并将其设置为外部cookie中间件。在您的应用程序中,您需要获取外部 cookie 身份并将其转换为外部登录数据,然后您可以与您的 db 用户进行检查。
这是一些示例代码。
使用应用程序 cookie 登录:
var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("Application");
identity.AddClaim(new Claim(ClaimTypes.Name, "<user name>"));
authentication.AuthenticationResponseGrant = new AuthenticationResponseGrant(identity, new AuthenticationProperties() {
IsPersistent = false
});
获取应用程序 cookie 身份:
var identity = System.Web.HttpContext.Current.User.Identity as ClaimsIdentity;
获取外部 cookie 身份 (Google):
var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var result = await authentication.AuthenticateAsync("External");
var externalIdentity = result.Identity;
从身份中提取外部登录数据:
public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
{
if (identity == null)
{
return null;
}
Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
|| String.IsNullOrEmpty(providerKeyClaim.Value))
{
return null;
}
if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
{
return null;
}
return new ExternalLoginData
{
LoginProvider = providerKeyClaim.Issuer,
ProviderKey = providerKeyClaim.Value,
UserName = identity.FindFirstValue(ClaimTypes.Name)
};
}