39

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

我一直在 CodePlex 上浏览代码,但有很多静态魔法。你能提供什么建议吗?

4

1 回答 1

46

使用以下代码设置 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)
    };
}
于 2013-09-20T18:46:05.857 回答