2016-05-11 27 views
5

ここでドキュメントに続いて、ポリシーベースの認証スキームを実装しようとしました。 http://docs.asp.net/en/latest/security/authorization/policies.html#security-authorization-handler-exampleASP.NET 5ポリシーベースの認証ハンドルが呼び出されていない

カスタムAuthorizationHandlerでHandleメソッドが呼び出されていないという問題が発生しました。 (それはここに投げられません)。また、コンストラクタに現在依存関係を注入します。

ここでAuthorizationHandlerコードです。

私が持っているスタートアップで
using WebAPIApplication.Services; 
using Microsoft.AspNet.Authorization; 

namespace WebAPIApplication.Auth 
{ 
    public class TokenAuthHandler : AuthorizationHandler<TokenRequirement>, IAuthorizationRequirement 
    { 
     private IAuthService _authService; 

     public TokenAuthHandler(IAuthService authService) 
     { 
      _authService = authService; 
     } 

     protected override void Handle(AuthorizationContext context, TokenRequirement requirement) 
     { 
      throw new Exception("Handle Reached"); 
     } 
    } 

    public class TokenRequirement : IAuthorizationRequirement 
    { 
     public TokenRequirement() 
     { 
     } 
    } 
} 

// Authorization 
      services.AddSingleton<IAuthorizationHandler, TokenAuthHandler>() 
       .AddAuthorization(options => 
       { 
        options.AddPolicy("ValidToken", 
         policy => policy.Requirements.Add(new TokenRequirement())); 
       }); 

コントローラのメソッドがあり、このエンドポイントを叩く

// GET: api/values 
     [HttpGet, Authorize(Policy="ValidToken")] 
     public string Get() 
     { 
      return "test"; 
     } 

は何も返さないと

warn: Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker[0] 
     Authorization failed for the request at filter 'Microsoft.AspNet.Mvc.Filters.AuthorizeFilter'. 
のコンソールに警告があります

私はこんにちは属性を正常に持たない他のエンドポイント。

SOS、 ジャック

+0

同じ問題があります。あなたはこれを理解したことがありますか? – rob

+0

はい、私は下に答えました、それはademのコメントにあなたのコメントとインラインで落ちます – Hamburglar

答えて

3

この質問への答えは、アダム・カグリンへのコメントで言及されています。

AuthorizationHandlerが呼び出される前にAuthorizeFilterが要求を拒否しているという問題があります。これは、Authorizeタグを使用するたびにMVCがAuthorizeFilterをパイプラインのAuthorizationHandlerの前に追加するためです。このAuthorizeFilterは、現在のユーザーIDのいずれかが承認されているかどうかを確認します。私の場合、すべてのユーザーに関連付けられた承認されたIDは存在しないため、これは常に失敗します。

解決策(IMOはややハッキリです)は、MVCコードの前に実行されるミドルウェアの断片を挿入することです。このミドルウェアは、一般的な認証済みのアイデンティティをユーザーに追加します(ユーザーがまだそれを持っていない場合)。

したがって、AuthorizeFilterのチェックは合格し、AuthenticationHandlerメソッドのHandleメソッドが実行され、私たちの問題は解決されます。ここからの応答を引用ミドルウェア・コード(app.UseMvc();が呼び出される前Configureに追加する必要がある)

app.Use(async (context, next) => 
    { 
     if (!context.User.Identities.Any(i => i.IsAuthenticated)) 
     { 
      context.User = new ClaimsPrincipal(new GenericIdentity("Unknown")); 
     } 
     await next.Invoke(); 
    }); 

を次のようにAuthorizeFilterをオーバーライドする別の方法は、ここで(Override global authorize filter in ASP.NET Core MVC 1.0)概要である

Asp.Net Core policy based authorization ends with 401 Unauthorized

1

は私がoptions.AutomaticChallenge = true;を追加すると、あなたの問題を解決すると思うAsp.net Core Authorize Redirection Not Happeningを見てみましょう。

+0

私はそれがcookieAuthenticationに固有かもしれないと思います。 'services.AddAuthorization()'を呼び出すと、認証ミドルウェアを使用している 'AutomaticChallenge'フィールド – rob

+0

を持たない' AuthorizationOptions'のインスタンスを取得しますか? –

+3

認証なしで '[Authorize]'属性を使うと、http://stackoverflow.com/questions/37276005/asp-net-core-policy-based-authorization-ends-with-401-unauthorizedを参照してください。 –

5

私はあまりにも長い間このことを理解していたので、私は参考のためにここに入れています...

私は(テストのために空の)カスタム必要条件とハンドラを実装していた:

using Microsoft.AspNetCore.Authorization; 
using System.Threading.Tasks; 

public class TestHandler : AuthorizationHandler<TestRequirement>, IAuthorizationRequirement 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TestRequirement requirement) 
    { 
     context.Succeed(requirement); 
     return Task.CompletedTask; 
    } 
} 

public class TestRequirement : IAuthorizationRequirement 
{ 

} 

は私のStartup.csConfigureServices()セクションでそれを登録:

services.AddAuthorization(options => 
{ 
    options.AddPolicy("Test", policy => policy.Requirements.Add(new TestRequirement())); 
    // Other policies here 
} 

は私のコントローラメソッドにこれを追加しました

[HttpGet] 
[Authorize(Policy = "Test")] 
public IActionResult Index() 
{ 
    Return View(); 
} 

しかし、コントローラメソッドへのすべてのリクエストで403エラー(401ではない)!

私はConfigureServices()(Dependency Injection)セクションがStartup.csTestHandlerと登録されていませんでした。

これは、誰かが机の上で頭を叩くのを避けるためです。 :|

+1

私のためにそれを修正しました。 AspNetCoreにDIを含めるのが大好きなので、登録する方法と方法を混乱させることがあります。 – mode777

関連する問題