2017-12-13 14 views
0

ユーザーがログインした後に呼び出されるシンプルなコントローラがあります。ユーザーがログインしていることを自分のIDサーバーで確認できます.AspNetCoreも見ることができます。 Identity.Applicationクッキーがブラウザに設定されます。コントローラがロードされていません.AspNetCore.Identity.Applicationユーザークッキー

ログインした後、ユーザーは、問題は、コントローラが認証されて表示されないことである

RedirectToAction(nameof(Index), "Manage") 

を使用して、このコントローラに転送されます。クッキー

var loadTheStupidCookie = await HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme); 
var user = await _userManager.GetUserAsync(loadTheStupidCookie.Principal); 

をロードするためにそれを強制的にその周りの仕事はこれがなく、働く私を発見した私はHttpContext.Userを試してみましたし、他のすべては、私は、コントローラがクッキー

[Authorize] 
[Route("[controller]/[action]")] 
public class ManageController : Controller 
{ 

    [HttpGet] 
    [AllowAnonymous] 
    public async Task<IActionResult> Index(ManageMessageId? message = null) 
    { 

     // try to find user here. 
    } 
} 

を読んされていないと考えることができます私はそれがコントローラー内のすべてのメソッドにロードする必要があると思う。コントローラが私のためにクッキーを読み込むことはできませんか?

startup.cs

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) 
       .AddCookie(options => 
       { 
        options.LoginPath = new PathString("/Account/Login"); 
        options.AccessDeniedPath = new PathString("/Account/Forbidden/"); 
       }) 
       .AddGoogle("Google", options => 
       { 
        options.AccessType = "offline"; 
        options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
        options.ClientId = "xxxxx.apps.googleusercontent.com"; 
        options.ClientSecret = "XXXX"; 
       }); 

から注:削除[のAllowAnonymous]それはおそらく、それが認証を参照してください傾けるという事実にまったく動作しないようになります。

+0

スタートアップのミドルウェア設定に 'app.UseAuthentication()'がありますか? – juunas

+0

@juunasはいその構成です。 – DaImTo

+0

UseMvc()前の前提ですか? :) – juunas

答えて

3

Authorize属性を使用すると、を使用して構成された既定のAuthenticationSchemeが使用されます。あなたの例では、それは次のようになります。これはCookieAuthenticationDefaults.AuthenticationScheme(「クッキー」)であるため、

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) 

Authorize属性は、ユーザーに署名しようとしたときにことを使用しているあなたの問題を回避するには、あなたが実際にIdentityConstants.ApplicationSchemeを使用していたことを示しています。 ( "Identity.Application") `を使用します。

Authorize属性はあなたがAuthenticationScheme(複数可)を指定することができますあなたはこのようになりますAuthenticationSchemesプロパティを使用して、使用したい:

[Authorize(AuthenticationSchemes = "Identity.Application")] 

それはあなたのように、直接IdentityConstants.ApplicationSchemeを使用することはできません判明これはコンパイル時定数ではありません。文字列値を明示的に使用することはできますが、ポリシーを設定するなどしてコンパイル時の安全性を得ることができます。それを行う方法の例については、docsを参照してください。

+0

私は何かに間違っていますか?私はクッキーをセットアップしましたか?それともこれのようにするのは大丈夫ですか? – DaImTo

+0

あなたがやっていることに本質的に間違ったことは何もありません - 複数のAuthenticationSchemeを使い、このように区別しても問題ありません。本当の質問は、両方のスキームが必要かどうかということですが、それは私があなたの特定のプロジェクトについて答えることができるものではありません。 –

+0

残念ながら、これは完全に問題を解決していないので、私はそれに関連する別の質問を開いた。 https://stackoverflow.com/q/47920836/1841839 – DaImTo

0

私はついにこの問題を解明しました。

services.AddAuthentication(options => 
       { 
        options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; 
        options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; 
       }) 

DefaultAuthenticateSchemeとDefaultChallengeSchemeの両方を設定する必要があります。 [承認]単独で動作します

代替ソリューションとしてこれを残してください。

関連する問題