web-dev-qa-db-ja.com

Identity Frameworkのマジックを無視してOWIN認証ミドルウェアを使用して、求めるクレームを取得するにはどうすればよいですか?

サードパーティのログインをASP.NETアプリに統合するOWINミドルウェアの要素は非常に優れていますが、くだらないMembership APIに代わる新しいIDフレームワークからそれを切り離す方法がわからないようです。結果のクレームとユーザー情報をEFベースのデータの永続化に保持することに興味はありません。クレーム情報が欲しいので、既存のプロジェクトの自分のユーザーアカウントに適用できます。このことを利用するためだけに新しいIDフレームワークを採用したくありません。

私はCodePlexでコードを閲覧してきましたが、静的な魔法がたくさんあります。何か提案はありますか?

39
Jeff Putz

次のコードを使用して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外部ログインミドルウェアをセットアップします。外部ログインミドルウェアは、外部ユーザーのログインデータをIDとして変換し、それを外部Cookieミドルウェアに設定します。アプリでは、外部Cookie IDを取得して外部ログインデータに変換する必要があります。その後、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 IDを取得します。

var identity = System.Web.HttpContext.Current.User.Identity as ClaimsIdentity;

外部Cookie ID(Google)を取得します。

var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var result = await authentication.AuthenticateAsync("External");
var externalIdentity = result.Identity;

IDから外部ログインデータを抽出します。

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)
    };
}
46
Hongye Sun