2016-09-06 23 views
8

ASP.NET Coreの認証パイプラインに関するいくつかの問題が発生しています。私のシナリオでは、OpenID ConnectとAzure ADを使ってすでに認証されているユーザーに挑戦したいと思っています。たとえば、AAD v2エンドポイントのシナリオで追加のスコープを要求する場合など、複数のシナリオが必要な場合があります。ASP.NETコアで認証されたユーザーに再度挑戦する

これはASP.NET MVCの魅力のように機能しますが、ASP.NET Core MVCでは、Cookie認証ミドルウェアで設定されたアクセス拒否ページにリダイレクトされています。 (ユーザーがログインしていない場合、チャレンジを発行すると期待どおりに動作します)

ウェブを検索してミドルウェアオプションのさまざまなパラメータを試した後、私は紛失している何かが明白であるか、またはこの動作が仕様であり、私は別の方法で私の要求を解決する必要があります。誰でもこれに関するアイデアは?

EDIT:私のStartup.csの関連部分は次のようになります。

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 

     services.AddAuthentication(
      SharedOptions => SharedOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     // <snip...> 

     app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme }); 

     var options = new OpenIdConnectOptions 
     { 
      AuthenticationScheme = OpenIdConnectDefaults.AuthenticationScheme, 
      ClientId = ClientId, 
      Authority = Authority, 
      CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"], 
      ResponseType = OpenIdConnectResponseType.CodeIdToken, 
      PostLogoutRedirectUri = "https://localhost:44374/", 
      TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
      { 
       ValidateIssuer = false 
      } 
     }; 
     options.Scope.Add("email"); 
     options.Scope.Add("offline_access"); 

     app.UseOpenIdConnectAuthentication(options); 
    } 

と行動は次のようになります。

public void RefreshSession() 
    { 
     HttpContext.Authentication.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); 
    } 
+0

AuthenticationSchemesの使用を検討しましたか?何らかのアクションに対してcookieauthenticationを無視する場合は、Authorize属性をazureaadschemeなどの別のスキームとともに使用できます。 –

+0

残念ながらそれはどちらも役に立たない。私が望むすべてのスキームを設定し、その挑戦のために1つを指定することができますが、クッキー認証はまだそれをどう扱うかに関係しています。そして、私はAuthorize属性を使用していないことに注意してください。ユーザーは既に認証されており、手動でチャレンジを発行します。 – VolatileCoder

+0

startup.csとアクションメソッドを投稿できますか? –

答えて

0
Try to sign out: 

public void RefreshSession() 
{ 
     HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); 
     HttpContext.Authentication.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme); 
     HttpContext.Authentication.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); 
} 
+0

それはどちらも動作しません。動作は、SignOutを発行してチャレンジを発行する別のアクションにリダイレクトすることです。しかし明らかにそれは別の往復を意味し、従って最適ではない。サインアウトの直後にチャレンジを出すと、サインアウトが作成したどんな応答でも上書きされます。 – VolatileCoder

+0

私はあなたの問題を解決するかどうかはわかりませんが、私はリモートサインアウトを追加しました。 –

+0

残念ながら、これは違いはありません。その間にリダイレクトがなければ、最後のステートメントはレスポンスがどのように表示されるかを指示します。したがって、これはサインアウトのものがなくてもチャレンジを発行するのと同じことです。そして、それ自体(最後の声明は応答を決定する)は問題ありません。 ChallengeがASP.NET vPrevの経験に基づいて動作するような応答を生成しないということだけです。 – VolatileCoder

2

私はヒントや解決策を見つけましたここに:https://github.com/aspnet/Security/issues/912。 ChallengeBehavior.Unauthorizedが「キー」です。

この投稿は、現在(2016年11月に - ASPNET 1.0.1)を与える回避策:https://joonasw.net/view/azure-ad-b2c-with-aspnet-core

あなたはChallengeBehavior.Unauthorized行動にAuthauticationManager.ChallengeAsyncを呼び出すことができるように新しいのActionResultが必要になります。

問題https://github.com/aspnet/Mvc/issues/5187が正常に閉じられると、これを統合する必要があります。

私はそれをテストしたところ、完全にうまくいった(私の目標は、単にユーザー単位でGoogleスコープを拡張することだった)。

関連する問題