如何忽略Identity Framework魔法并使用OWIN auth中间件来获取我寻求的声明?

时间:2013-09-19 03:00:42

标签: asp.net owin

将第三方登录集成到ASP.NET应用程序的OWIN中间件非常酷,但我似乎无法弄清楚如何从新的ID框架中删除它来取代糟糕的Membership API。我对在基于EF的数据持久性中持久化声明和用户信息不感兴趣,我只想要声明信息,以便我可以将它应用于我自己在现有项目中的用户帐户。我不想采用新的ID框架来利用这些东西。

我一直在浏览CodePlex上的代码,但是有很多静态魔法。你能提出任何建议吗?

1 个答案:

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