将第三方登录集成到ASP.NET应用程序的OWIN中间件非常酷,但我似乎无法弄清楚如何从新的ID框架中删除它来取代糟糕的Membership API。我对在基于EF的数据持久性中持久化声明和用户信息不感兴趣,我只想要声明信息,以便我可以将它应用于我自己在现有项目中的用户帐户。我不想采用新的ID框架来利用这些东西。
我一直在浏览CodePlex上的代码,但是有很多静态魔法。你能提出任何建议吗?
答案 0 :(得分:45)
使用以下代码设置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和Google外部登录中间件。外部登录中间件将外部用户登录数据转换为标识,并将其设置为外部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)
};
}