2016-09-22 13 views
1

私は次のようないくつかのREST操作と.NETコアアプリケーション(以下のコードを参照)を有する:ミドルウェア


    namespace Controllers 
    { 
     [Route("system")] 
     public class SystemController : Controller 
     { 
     // This is a public access method 
     [HttpGet("dictionaries/{name}")] 
     public List GetDictionary(HttpRequestMessage requestMsg, string name) 
     { 
      // etc 
     } 

     // This function shall be accessible only by an admin role 
     [AdminRole] 
     [HttpPost("dictionaries/{name}")] 
     public IActionResult PostDictionary(HttpRequestMessage requestMsg, string name) 
     { 
      // etc 
     } 
     } 
    } 

を私はいくつかの操作がアクセスできるようにフラグを付けます特定の役割(adminなど)によってのみ許可されます。エレガントな方法は、属性を使用することです。

今、私はC#の方法は、URLに応じて呼び出されるようにトラップの正しいMiddleware実装がどうなるかを決定し、リフレクションを使用してrole属性(もしあれば)を取得したいので、私は不正な通話をブロックすることができます。

アドバイスをしてください。

+3

属性は '[Authorize(Roles =" Administrator ")]'のように、あなたが望むようにしていませんか? [the docs](https://docs.asp.net/en/latest/security/authorization/roles.html)をチェックしてください。 –

答えて

0

何かの理由でビルドインRole based Authorization(質問にコメントとしてマークされている)を使用したくない場合にのみ、以下のアプローチが注目されたいと思います。


あなたは(それがMVCの一部であり、したがって「コントローラロジック」で動作可能)グローバルAction Filterを作成した場合、あなたはActionExecutingContextからすべての必要な情報を得ることができます。

public class SampleActionFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     //Provides information about an action method, such as its name, controller, parameters, attributes, and filters. 
     var actionDescriptor = context.ActionDescriptor; 

     //Gets the controller instance containing the action. 
     var controller = context.Controller; 

     // Gets the arguments to pass when invoking the action. Keys are parameter names. 
     var actionArgs = context.ActionArguments; 
    } 

    ... 
} 

context.ActionDescriptorすることができControllerActionDescriptorにキャストされました。

public class ControllerActionDescriptor : ActionDescriptor 
{ 
    public string ControllerName { get; set; } 

    public virtual string ActionName { get; set; } 

    public MethodInfo MethodInfo { get; set; } 

    public TypeInfo ControllerTypeInfo { get; set; } 

    ... 
} 

ないコントローラはMVCミドルウェアの一部であるとして、あなたは、そのためのミドルウェアを使用できることを確認してください:それは直接、次のプロパティを使用することができます。ミドルウェアをその前に配置すると、そのパイプラインステップにはまだ "コントローラ"ロジックがありません。そして、後になったら、あなたが望むものは遅すぎます。