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