2016-09-20 5 views
3

私は認証ハンドラを使用して、.netコアのコントローラにカスタム認証を設定しています。コントローラーからパラメーターを取得し、それを認可ハンドラーに使用するにはどうすればよいですか。authrizationhandler .netコアからparamsを取得する方法

古い.NETで、私はからパラメータを取得することができているHttpContext私はあなたのハンドラでは、.NETのコア

enter code here 

public class HasAdminRoleFromAnySiteRequirement : AuthorizationHandler<HasAdminRoleFromAnySiteRequirement>, IAuthorizationRequirement 
{ 

    public HasAdminRoleFromAnySiteRequirement() 
    { 

    } 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
     HasAdminRoleFromAnySiteRequirement requirement) 
    { 

    //need to call get param from controller to used in the validation 
    // something like this 
    //var eventId = filterContext.RequestContext.HttpContext.Request.Params["id"]; 
    // I tried the suggestion below but I can't get the parameter from routedata 
    // var mvcContext = context.Resource as  Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;    

     return Task.FromResult(0); 
    } 
} 
+0

私はすでになく、チェックすると、のHttpContextがnull –

+0

であるあなたがしようとしたどのようなコードを投稿できることをしようとしましたか? –

答えて

6

でそれを達成することができますどのように私はわからないこの

var eventId = filterContext.RequestContext.HttpContext.Request.Params["id"]; 

のような要求のparam次の操作を実行できます

var mvcContext = context.Resource as 
    Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext; 

if (mvcContext != null) 
{ 
    // Examine MVC specific things like routing data. 
} 

パラメータ値を使用する場合は、authorize属性綴じる前に綴じが行われています。代わりに、コントローラの中で命令的な呼び出しに移動します。これは基本的にresource based authorizationです。パラメータはリソースです。

コントローラに認可サービスを注入します。

public class DocumentController : Controller 
{ 
    IAuthorizationService _authorizationService; 

    public DocumentController(IAuthorizationService authorizationService) 
    { 
     _authorizationService = authorizationService; 
    } 
} 

次に、ハンドラを少しずつ書きます。あなたはこのハンドラがドキュメントを取る見ることができます

public class DocumentAuthorizationHandler : AuthorizationHandler<MyRequirement, Document> 
{ 
    public override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
               MyRequirement requirement, 
               Document resource) 
    { 
     // Validate the requirement against the resource and identity. 

     return Task.CompletedTask; 
    } 
} 

、これは、あなたが好きなことができ、それは、IDの整数、またはビューモデルのいくつかのタイプです。

次に、HandleRequirementAsync()メソッド内でアクセスできます。

最後に、バインドが行われると、コントローラ内から呼び出すことができます。

if (await authorizationService.AuthorizeAsync(
    User, 
    document,  
    yourRequirement)) 
{ 
} 
+0

私はこれを試しましたが、ルーテータのパラメータを見つけることができません –

+0

認証が実行される時点で、パラメータのバインドが行われていません。 AuthorizeサービスでAuthorizeAsync()メソッドを呼び出すことによって、コードを手動で解析するか、命令的にチェックする必要があります。それは本当にあなたが必要とするパラメータ値に依存します。 – blowdart

+0

申し訳ありませんが、あなたの答えは正しいです。ご協力ありがとうございました –

関連する問題