2016-09-19 12 views
2

私はミドルウェアの概念に比較的新しいです。私はミドルウェアが完了すると次のミドルウェアを呼び出すことを知っています。複数の認証ミドルウェアASP.NETコア

Googleまたはアイデンティティ・サーバーを使用してリクエストを認証しようとしています。ユーザーは、Googleまたはローカルアカウントで自分のモバイルアプリにログインすることができます。しかし、私は両方の認証ミドルウェアを使用する方法を把握することはできません。 googleのid_tokenを渡すと、最初のミドルウェア(UseJwtBearerAuthentication)を渡しますが、2番目のミドルウェア(UseIdentityServerAuthentication)は失敗します。実際に少なくとも1つの認証ミドルウェアを通過したときにエラーをスローしないようにするにはどうすればよいですか?たとえば、最初のミドルウェアを通過する場合、2番目のミドルウェアは無視されますか?

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    Authority = "https://accounts.google.com", 
    Audience = "secret.apps.googleusercontent.com", 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     ValidateAudience = true, 
     ValidIssuer = "accounts.google.com" 
    }, 
    RequireHttpsMetadata = false 
}); 

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "http://localhost:1000/", 
    RequireHttpsMetadata = false, 

    ScopeName = "MyApp.Api" 
}); 

答えて

4

認証ミドルウェアが失敗している。通常、(私は例外を投げる意味するものではありません)、これは別の成功した認証ミドルウェアには影響を与えません。おそらく、2番目のミドルウェアが例外をスローします(検証エラーではありません)。最初にエラーメッセージを確認し、解決するようにしてください。できない場合は、AuthenticationFailedイベントを使用してエラーを処理してください。あなたのscenerioのために私はあなたの方法を選択しないだろう、

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    // ... 
    Events = new JwtBearerEvents() 
    { 
      OnAuthenticationFailed = async (context) => 
      { 
       if (context.Exception is your exception) 
       { 
        context.SkipToNextMiddleware(); 
       } 
      } 
    } 
}); 

しかし:この場合、あなたのコードは、以下のようなものでなければなりません。私はIDサーバーのエンドポイントだけを使用します。 Googleと署名のためには、以下のようなアイデンティティサーバーを構成することができます。

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme, 
      AutomaticAuthenticate = false, 
      AutomaticChallenge = false 
     }); 

     app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme, 
      ClientId = "", 
      ClientSecret = "" 
     }); 

     app.UseIdentityServer(); 

編集

AuthenticationFailedイベントがIdentityServer4.AccessTokenValidationのために使用することができなかったようです。私は確信していませんが、jwtトークンだけにIDサーバーを使用する場合は、UseJwtBearerAuthenticationを検証に使用できます。

+0

私が家に帰ったときに解決策2を試し、それを答えとしてマークします。ご返信ありがとうございます。 –

関連する問題