web-dev-qa-db-ja.com

UseCookieAuthenticationとUseExternalSignInCookie

Owinを使用して、Google oAuthで認証します。クッキーの設定方法は次のとおりです。

// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Authentication/Login")
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

したがって、UseCookieAuthenticationとUseExternalSignInCookieの両方を使用していますが、冗長なようです。これら2つのAuthenticationTypeのうち、IAuthenticationManagerメソッド(SignIn、SingOUtなど)に指定する必要があるのはどれですか?または、そのうちの1つだけを保持する必要がありますか?

更新私を最も混乱させるのは、SignInメソッドです:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

したがって、ExternalCookieからサインアウトしますが、ApplicationCookieにサインインします。

48
SiberianGuy

Googleのサインインを機能させるには、それらすべてが必要です。これがその仕組みです。 OWINパイプラインには、3つのミドルウェアコンポーネントがあります。(1)アクティブモードで実行されているCookie認証ミドルウェア、(2)パッシブモードで実行されているCookie認証ミドルウェアの別のインスタンス、および(3)Google認証ミドルウェア。そのようになります。

_app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    ...
}); // Active

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Passive

app.UseGoogleAuthentication(...);
_

401がある場合、ユーザーはGoogleにリダイレクトされます。そこでユーザーがログインし、Googleが資格情報を検証します。その後、Googleはユーザーをアプリにリダイレクトします。この時点で、Google認証ミドルウェアはログイン情報を取得し、許可(外部Cookieの読み取り)を適用し、OWINパイプラインを短絡して、ExternalLoginCallbackAccountControllerアクションメソッドに対応する外部コールバックURLにリダイレクトします。そのため、リダイレクトの結果としてリクエストがアプリに届くこの時点で、ユーザー名と電子メールクレームを含む外部Cookieを取得します。

このCookieを読み取り、Googleからデータ(ユーザー名など)を取得するには、パッシブモードで実行されているCookie認証ミドルウェアを使用します。このミドルウェアはパッシブモードで実行されるため、Cookieを読み取るように指示する必要があります。 ExternalLoginCallbackアクションメソッドでAuthenticationManager.GetExternalLoginInfoAsync()の呼び出しが行われると、これが起こります。その時点で、外部CookieからのIDが確立されており、このIDにはGoogleからの名前とメールの申し立てのみが含まれています。

通常、この時点で、アプリケーションデータストアからユーザー固有の情報を取得し、IDにクレームを追加する必要があります。したがって、外部CookieミドルウェアでSignoutを呼び出します。これにより、外部Cookieの有効期限が切れて外部Cookieが返送されなくなります。そのため、その時点で使用可能なID情報を使用して、ExternalLoginCallbackアクションメソッドで_UserManager.FindAsync_が呼び出され、すべてのアプリケーション固有のクレームをユーザーに返す必要があります。その新しいIDを使用して、アクティブモードで実行されているCookie認証ミドルウェアでSignInを呼び出します。これにより、新しいCookieが作成されます。外部Cookieと比較して、この新しいCookieにはアプリケーション固有のクレームがすべて含まれています。その後、このCookieを取得し、アクティブモードで実行されているCookie認証ミドルウェアがCookieをアクティブに読み取り、すべてのアプリケーション固有のクレームの完全なリストでIDを確立します。

したがって、Signinを呼び出さないと、アプリケーション固有のすべてのクレームを含むcookieを作成することはありません。しかし、他のメカニズムを使用するかどうかはあなた次第です。すぐに使用できる動作は、アプリケーション固有のすべてのクレームを含むローカルCookieがSignInへの呼び出しによって作成され、その後アクティブモードで実行されているCookieミドルウェアによって読み取られることです。

更新:2つのCookieミドルウェアインスタンスを使用せずに逃げる方法を説明するブログ投稿を作成しました。 http://lbadri.wordpress.com/2014/10/14/barebones-asp-net-mvc-google-signin-through-owin-middleware/

87
Badri

「SignOut(DefaultAuthenticationTypes.ExternalCookie)」は、Hao Kungの回答による「クリーンアップ、外部Cookie」です https://stackoverflow.com/a/20575643/2710179

Microsoft.aspnet.identity.samplesプロジェクトには、nugetからダウンロードできるNice実装があります。この実装では、以下を使用します。

    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

「ExternalCookie」は「設定されたExternalSignInAuthenticationTypeに使用されるデフォルト値」です。これは、外部サイトに対してユーザーを検証するための一時的なCookieの使用として使用されることを意味すると思います

7
Jonathan Jansen