2016-02-26 12 views
5

私はCookieAuthenticationOptions.AuthenticationTypeとは何ですか?自分のアプリケーションのAsp.Netアイデンティティ認証ミドルウェアの設定で

app.UseCookieAuthentication(new CookieAuthenticationOptions { 
    LoginPath = new PathString("/Login/"), 
    //AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    Provider = new CookieAuthenticationProvider { 
    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<MyUserManager, MyUser>(
         TimeSpan.FromMinutes(30), 
         (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie) 
        ), 
    }, 
}); 

を持って、私は他のアプリからこれをコピーしていたと私はちょうど私がAuthenticationType行のコメントを外した場合、ログインが(私は私の中で、成功メッセージが表示されます成功していることに気づきました私のコントローラから書かれたロガー)が、ログイン画面に常にリダイレクトします。 documentation for CookieAuthenticationOptions

それはオプションでAuthenticationTypeがIIdentity AuthenticationTypeプロパティに対応

言います。別の値がパイプラインで複数回、同じ認証ミドルウェア・タイプを使用するために割り当ててもよい。(AuthenticationOptionsから継承されます。)

私は本当にこれが何を意味するか理解していない、なぜこれが私のログインを引き起こしますリダイレクトリクエスト(成功したログイン後も)、またこのオプションが何であるのかが役に立ちます。

答えて

4

これは文字列で、何でもかまいません。しかし、これは認証タイプの識別子です。また、ユーザー、Google、Facebookなどの複数の認証タイプを持つことができます。これは、サインイン時に生成されたCookieにクレームとして追加されています。

ユーザーに署名するときに認証プロバイダを知る必要があります。あなたの認証ミドルウェアは、次のように定義されている場合:プリンシパルが作成されたときAuthenticationManager.SignOut("My-Magical-Authentication")

はまた、この文字列はClaimsIdentityに渡されます。

app.UseCookieAuthentication(new CookieAuthenticationOptions { 
     LoginPath = new PathString("/Login/"), 
     AuthenticationType = "My-Magical-Authentication", 
     // etc... 
     }, 
    }); 

は、あなたが同じ魔法の文字列を必要とするユーザーをサインアウトします。そして AuthenticationType主なし becauseを認証することができない。

/// <summary> 
/// Gets a value that indicates whether the identity has been authenticated. 
/// </summary> 
/// 
/// <returns> 
/// true if the identity has been authenticated; otherwise, false. 
/// </returns> 
public virtual bool IsAuthenticated 
{ 
    get 
    { 
    return !string.IsNullOrEmpty(this.m_authenticationType); 
    } 
} 

この方法IsAuthenticatedはこれに依存するすべての認証メカニズムと、全体MVCのコードベースを介して使用されます。

理論的には、複数のプロバイダーからサインインして、一度に1つだけサインアウトすることができ、残りのプロバイダーはまだ認証されたままです。私はこれを試みたことはありませんが。

私が見つけたもう1つの使用 - ミドルウェア構成にCookieNameを指定しないと、Options.CookieName = CookieAuthenticationDefaults.CookiePrefix + Options.AuthenticationType;see second if statement in constructor)になります。

もっと多くの場所が使用されているはずです。しかし、最も重要なことは、それを提供し、名前と一貫しているか、認証システムに微妙なバグがあることです。もしStartup.Auth に(別のアプリからコピーされたコードとは対照的に)、新鮮なasp.net溶液、標準セットアップコードを設定AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,

を含む場合

4

私は全体の答えを知らないが、私はそれに何かの例を持っているが役に立ちます。

私はマルチテナントのウェブサイトを持っています。ウェブサイトは、複数のドメインがリンクされている単一のインスタンスとして実行されます。各ドメインは別々のテナント(別個のユーザーを持つ)です。テナントごとにFacebookログインを実装するには、テナントごとにFacebookアプリが必要でした。これを設定するには、私はユニークCallbackPath テナントごとに一意AuthenticationType設定する必要がありました:

var facebookOptions = new FacebookAuthenticationOptions 
{ 
    AuthenticationType = "Facebook-{tenantID}", 
    CallbackPath = new PathString($"/signin-facebook-{tenantID}") 
} 

私はそれはまた、クッキー名として使用されたと思ったが、それはFacebookAuthenticationなどの外部ログインの場合ではないのです。要求したときに私が気づいたことはAuthenticationTypeのこの値がポップアップすることをされています

  1. をauthenticationManager.GetExternalLoginInfoAsync経由IdentityUserLogin.LoginProvider()
  2. authenticationManager.GetExternalAuthenticationTypes経由AuthenticationDescription.AuthenticationTypeは、()(論理的なようです;-) 1と同様、各user.Logins()

そして最後にではなく、少なくとも用)

  • IdentityUserLogin.LoginProvider:AuthenticationTypeの値は、データベースカラムAspNetUに格納されていますserLogins.LoginProvider。

  • 2

    これが作成ブラウザのアクティブなクッキーリストを見ると、ユーザーがすべてのリクエストに対して認証されているかどうかをチェックするために使用されます(デフォルト名は.AspNet.ApplicationCookie)。クッキーが存在しない場合(またはユーザーが何らかの方法で認証されていない場合)、ミドルウェアはご使用の回線に指定されたルートにリダイレクトしますLoginPath = new PathString("/Login/"),

    この行がコード内でコメントアウトされ、ユーザーを認証するためにコードに非標準構成がいくつか存在します。この行のコメントを外してログインが成功してもログインにリダイレクトすると、非標準コードとミドルウェアの間に何らかの競合があり、その結果ミドルウェアはユーザーが認証されていないと判断し、LoginPathにリダイレクトされます。

    私はあなたのアプリに非標準の認証コードがあるかどうかを調べ、それが具体的に何をしているのかを判断し、競合の回答自体を提示する必要があります。一般的なアドバイスは、これを行うことの意味が正確であることがわからないかぎり(そしてそれが複雑になることがある)、標準の認証コードを変更することではありません。

    特に、このオプションは有用ではないだけでなく、Identityミドルウェアの標準的な操作の基本です。あなたのアプリには標準でないコードがあるようです。もしそうなら、あなたはログインセキュリティに関して何が何をするのか(そしてその意味合い)を完全に判断しなければなりません。可能であれば標準のアイデンティティコードに戻すべきです。

    関連する問題