我如何忽略身份框架魔法,并使用OWINauthentication中间件来获得我所寻求的主张?

OWIN中间件将第三方login集成到你的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何从新的ID框架中取代蹩脚的Membership API。 我没有兴趣在基于EF的数据持久化中持久化所产生的声明和用户信息,我只是想索赔信息,所以我可以将其应用到我自己的用户帐户在现有的项目。 我不想采用新的ID框架来利用这些东西。

我一直在浏览CodePlex上的代码,但有很多的静态魔术。 你能提供一些build议吗?

使用以下代码来设置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外部login中间件。 外部login中间件会将外部用户login数据转换为标识,并将其设置为外部Cookie中间件。 在您的应用程序中,您需要获取外部cookie身份并将其转换为外部login数据,然后您可以使用db用户检查它。

这里是一些示例代码。

用应用程序cookielogin:

 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; 

从身份提取外部login数据:

 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) }; }