2016-10-29 19 views
3

私は、ASP.NET Coreでの認証の仕組みを理解しようと、複数のチュートリアルを行っています。ミドルウェアがリクエストを処理する方法の一般的な概念を理解しています。しかし、私はどのようにが正確に動作するのか混乱しています。私は基本的にあなたの暗号化されたアイデンティティであるクッキーを探していることを理解しています、そしてそこにあれば、あなたの現在のアイデンティティをクッキーの値に設定します。Asp.NetコアでCookieAuthenticationMiddlewareを使用してログイン

実際のCookieAuthenticationMiddlewareの元のCookieはどのように作成されますか。このミドルウェアは、すでに読み込まれたクッキーがすでに生成されている場合にのみ役立ちます。私には、最初のクッキーを設定するために、ソーシャルログインのような別のオーセンティケータが必要になります。次のようなものがあります。

app.UseCookieAuthenticationMiddleware(...) 
app.UseFacebookAuthentication(...) 

さらに、Facebook認証はCookie認証ミドルウェアが認識するクッキーをどのように設定しますか?

await HttpContext.Authentication.SignInAsync(
    "MyCookieMiddlewareInstance", 
    principal); 

たぶん、Facebookのミドルウェアがクッキーを設定し、これを呼び出しますが、私は本当に何この方法を理解していない:ドキュメントは、あなたが(おそらくFacebookのミドルウェアから)プリンシパルを作成したら、あなたが呼び出すことができると述べていますそうです。

私の質問は、基本的に2つのポイントに分かれています。最初のクッキーはどのようにしてクッキー認証ミドルウェア用に作成されますか?HttpContext.Authentication.SignInAsync(...)はクッキーを作成するためにクッキーミドルウェアをトリガーしますか?

ありがとうございます!

+0

オープンソースのasp.netについての素晴らしいところは、あなたはソースコードを勉強することができます。 Cookieミドルウェアやその他のセキュリティコンポーネントの内部について詳しく知りたい場合は、こちらのコードをご覧ください。https://github.com/aspnet/Security –

答えて

2

CookieAuthenticationMiddlewareの元のCookieはどのように作成されますか。

クッキー認証ミドルウェアがユーザーに署名し、クッキーを作成します。クッキー承認ミドルウェアは、クッキー値を探します。

説明すると、a few lines from the CookieAuthenticationHandlerは、クッキー認証ミドルウェアがクッキーを設定していることを示しています。

Options.CookieManager.AppendResponseCookie(
    Context, 
    Options.CookieName, 
    cookieValue, 
    cookieOptions); 

そしてここでは、コンテキストに追加されたクッキーの値を探して承認ミドルウェアを示しa few lines from the DenyAnonymousAuthorizationRequirement : IAuthorizationHandlerあります。

var user = context.User; 
var userIsAnonymous = 
    user?.Identity == null || 
    !user.Identities.Any(i => i.IsAuthenticated); 
if (!userIsAnonymous) 
{ 
    context.Succeed(requirement); 
} 

ます。また、この質問:...

をどのようにFacebookの認証は、クッキー認証ミドルウェアを認識することになるクッキーを設定するのでしょうか?

Facebook認証はOAuth認証で、これは次の継承階層の最下部にあることを意味します。 FacebookのOAuthので

IAuthenticationHandler 
└── AuthenticationHandler 
    └── CookieAuthenticationHandler 
    └── RemoteAuthenticationHandler 
     └── OAuthHandler 
      └── FacebookHandler 

RemoteAuthenticationHander.HandleRemoteCallbackAsyncは、Facebookの応答を処理した後、 SignInAsyncを呼び出します。

Context.Authentication.SignInAsync(
    Options.SignInScheme, 
    context.Principal, 
    context.Properties); 

SignInAsyncへの呼び出しは、あなたの質問で仮説したものです。

... Facebookミドルウェアは[SignInAsync]を呼び出してクッキーを設定しますが、このメソッドが何をしているのかは分かりません。

SignInAsyncとは何ですか? SignInAsyncの呼び出しは、Context.Authenticationプロパティの内部にあるAuthenticationManagerのインスタンスで発生します。そのインスタンスは通常DefaultAuthenticationManagerです。 the full SignInAsync call hereが表示され、ここから抜粋したものです。すなわち

public override async Task SignInAsync(
    string authenticationScheme, 
    ClaimsPrincipal principal, 
    AuthenticationProperties properties) 
{ 
    ... 

     var handler = HttpAuthenticationFeature.Handler; 

     var signInContext = new SignInContext(
      authenticationScheme, 
      principal, 
      properties?.Items); 

     if (handler != null) 
     { 
      await handler.SignInAsync(signInContext); 
     } 

    ... 
} 

SignInAsyncコール継承階層からIAuthenticationHandlerのインスタンスであることを起こる認証ハンドラにSignInAsync

最終的にはCookieAuthenticationHandler.HandleSigninAsyncに到着しました。which will append the cookie to the response.このクッキーハンドラには、セキュリティリポジトリにAppendResponseCookieという2つのコールしか含まれていません。

protected override async Task HandleSignInAsync(SignInContext signin) 
{ 
    ... 

    Options.CookieManager.AppendResponseCookie(
     Context, 
     Options.CookieName, 
     cookieValue, 
     signInContext.CookieOptions); 

    ... 
} 

多くの可動部品があります。うまくいけば、この答えはあなた自身が不足している作品を埋めるために十分な概要を与えます。

関連する問題