2017-10-25 5 views
6

私は、Webアプリケーション(Model-View-Controller)テンプレートと.Netを使用して、VS17で新しいASP.NETコアWebアプリケーションプロジェクトを作成しましたフレームワーク "+" ASP.NET Core 2 "を設定します。認証設定は「個別のユーザーアカウント」に設定されています。同じエンドポイントのCookieとベアラ認可を組み合わせたASP.NET Core 2.0

私は次のサンプルのエンドポイントがあります。

[Produces("application/json")] 
[Route("api/price")] 
[Authorize(Roles = "PriceViwer", AuthenticationSchemes = "Cookies,Bearer")] 
public class PriceController : Controller 
{ 

    public IActionResult Get() 
    { 
     return Ok(new Dictionary<string, string> { {"Galleon/Pound", 
                "999.999" }); 
    } 
} 

"Cookies,Bearer"CookieAuthenticationDefaults.AuthenticationSchemeJwtBearerDefaults.AuthenticationSchemeを連結することによって導出されます。

トークンとクッキーの両方の認証方法を使用してアクセスできるように、エンドポイントの許可を設定できるようにすることを目的としています。ここで

私は私のStartup.csでの認証のために持っている設定は次のとおりです。

ので
services.AddAuthentication() 
     .AddCookie(cfg => { cfg.SlidingExpiration = true;}) 
     .AddJwtBearer(cfg => { 
      cfg.RequireHttpsMetadata = false; 
      cfg.SaveToken = true; 
      cfg.TokenValidationParameters = new TokenValidationParameters() { 
                ValidIssuer = Configuration["Tokens:Issuer"], 
                ValidAudience = Configuration["Tokens:Issuer"], 
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])) 
               }; 
     }); 

、私はブラウザを使用してエンドポイントにアクセスしようとすると、I get the 401 response with a blank html page.

その後、私はログインして、私がしようとするとエンドポイントに再びアクセスするには、私は同じ応答を得ます。

次に、ベアラトークンを指定してエンドポイントにアクセスしようとします。 And that returns the desired result with the 200 response.

私は[Authorize(AuthenticationSchemes = "Cookies,Bearer")]を削除するのであれば、その後、状況は逆になる - クッキー認証作品と上記使用されるようにしかし同じベアラトークン方式、200を返すことは何も結果が得られていないと単にデフォルトAspIdentityのログインページにリダイレクト。

私はここ2可能性のある問題を見ることができます:

1)ASP.NETコアは「組み合わせ」の認証を許可していません。 2) 'Cookies'は有効なスキーマ名ではありません。しかし、正しいものは何ですか?

お知らせください。ありがとうございました。

+0

Idendityを使用していますか? – Nikolaus

+0

aspnet core 1.0で同じcookieとBearerを使用しています。 2.0への移行私は同じ問題を抱えています:( – Ruchan

+0

アクションで「AuthenticationScheme」といっしょに言及する必要はないでしょう。 – Ruchan

答えて

3

あなたのコントローラにAuthenticationSchemeを設定する必要はないと思います。私の情報源の文書化のため

// requires: using Microsoft.AspNetCore.Authorization; 
//   using Microsoft.AspNetCore.Mvc.Authorization; 
services.AddMvc(config => 
{ 
    var policy = new AuthorizationPolicyBuilder() 
        .RequireAuthenticatedUser() 
        .Build(); 
    config.Filters.Add(new AuthorizeFilter(policy)); 
}); 

:ちょうどこのようなConfigureServicesで認証されたユーザを使用する部分についてはregisterAuthorizationHandlers

、スキームキーが有効ではなかったかどうか、あなたが使用することを、補間された文字列を使用することができます右キー:

[Authorize(AuthenticationSchemes = $"{CookieAuthenticationDefaults.AuthenticationScheme},{JwtBearerDefaults.AuthenticationScheme}")] 

編集: をそれは2つのスキームそれとも様に法を承認することはできませんが、あなたは、2つのPを使用することができます。私は、さらに研究を行なったし、次の結論に達した publicメソッドを呼び出すと、次のようなprivateメソッドが呼び出されます。

//private method 
private IActionResult GetThingPrivate() 
{ 
    //your Code here 
} 

//Jwt-Method 
[Authorize(AuthenticationSchemes = $"{JwtBearerDefaults.AuthenticationScheme}")] 
[HttpGet("bearer")] 
public IActionResult GetByBearer() 
{ 
    return GetThingsPrivate(); 
} 

//Cookie-Method 
[Authorize(AuthenticationSchemes = $"{CookieAuthenticationDefaults.AuthenticationScheme}")] 
[HttpGet("cookie")] 
public IActionResult GetByCookie() 
{ 
    return GetThingsPrivate(); 
} 
+0

ありがとうございました! 残念ながら、これは問題を解決しません。コメントからconfigスニペットを使用し、エンドポイントデコレータからAuthenticationSchemeを削除すると、標準のCookieメソッドは機能しますが、トークンは使用しません。 – maximiniini

+0

@maximiniini注文を元に戻そうとしましたか?次のようになります。 '[Authorize(AuthenticationSchemes =" Bearer、Cookies ")]' – Nikolaus

+0

@maximiniini答えを更新しました。たぶんこれがあなたを助けることができます。 – Nikolaus

関連する問題