2015-11-13 13 views
6

現在の実装がポリシー/要件に依存しているため、ASP.NET 5でカスタム認可フィルタをプログラムする方法を探していますしたがって、私は本当に疲れている(私はすべての味を試してみました)のumpteenthと刻々と変化するアイデンティティシステムで。DIをASP.NET MVC 6の要件/ポリシーに追加する

私は自分のリポジトリを持っているのでクレームとしてコード化したくないほどのパーミッション(200以上)があります。何百もの文字列を比較するよりもチェックする方がはるかに高速ですどのような主張が最後にあるのか)。

私は権限の私のカスタムリポジトリに対してチェックする必要があり、各属性にパラメータを渡す必要があり

[Authorize(Requires = enumPermission.DeleteCustomer)] 

私はこれが最も頻繁なシナリオではないですけど、私はそれがエッジではないと思います場合。私は、彼の偉大なポスト "ASP.NET 5とMVC 6のセキュリティ:Authorization"の@leastprivilegeで説明されている方法で実装しようとしましたが、私も著者と同じ壁にヒットしました。 ASP.NET 5 githubリポジトリの問題はあまり明確でない方法で閉じられました:link

どのようにこれを達成するためのアイデアですか?多分他の種類のフィルターを使用していますか?その場合、どうですか?続き

+0

どこが問題なのですか?依存関係が解決されていないか、パラメータが設定されていませんか? –

+0

問題は、引数をオブジェクトの配列として渡してフィルタ内に取り込む方法を理解できないということです。以前のバージョンでは、フィルタ自体に同じ名前のパブリックプロパティを作成していましたあなたが渡していたパラメータとして(上記のように)、今ではオブジェクト配列を渡す必要があります。 – Vi100

+0

これは新しい権限フィルタの問題ですが、質問の意図はポリシーでこれを実現する実装を求めることでした/ requirements – Vi100

答えて

1

は、あなたがこのシナリオを実現することができる方法の例です。

は、あなたが与えられたユーザは、属性に指定された必要な権限を持っている場合検証するIPermissionStoreサービスを呼び出していると仮定しましょう。

public class MyCustomAuthorizationFilterAttribute : Attribute, IFilterFactory, IOrderedFilter 
{ 
    private readonly Permision[] _permissions; 

    public MyCustomAuthorizationFilterAttribute(params Permision[] permissions) 
    { 
     _permissions = permissions; 
    } 

    public int Order { get; set; } 

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) 
    { 
     var store = serviceProvider.GetRequiredService<IPermissionStore>(); 

     return new MyCustomAuthorizationFilter(store, _permissions) 
     { 
      Order = Order 
     }; 
    } 
} 

public class MyCustomAuthorizationFilter : IAuthorizationFilter, IOrderedFilter 
{ 
    private readonly IPermissionStore _store; 
    private readonly Permision[] _permissions; 

    public int Order { get; set; } 

    public MyCustomAuthorizationFilter(IPermissionStore store, params Permision[] permissions) 
    { 
     _store = store; 
     _permissions = permissions; 
    } 

    public void OnAuthorization(AuthorizationContext context) 
    { 
     // Check if the action has an AllowAnonymous filter 
     if (!HasAllowAnonymous(context)) 
     { 
      var user = context.HttpContext.User; 
      var userIsAnonymous = 
       user == null || 
       user.Identity == null || 
       !user.Identity.IsAuthenticated; 

      if (userIsAnonymous) 
      { 
       Fail(context); 
      } 
      else 
      { 
       // check the store for permissions for the current user 
      } 
     } 
    } 

    private bool HasAllowAnonymous(AuthorizationContext context) 
    { 
     return context.Filters.Any(item => item is Microsoft.AspNet.Authorization.IAllowAnonymous); 
    } 

    private void Fail(AuthorizationContext context) 
    { 
     context.Result = new HttpUnauthorizedResult(); 
    } 
} 

// Your action 
[HttpGet] 
[MyCustomAuthorizationFilter(Permision.CreateCustomer)] 
public IEnumerable<string> Get() 
{ 
    //blah 
} 
+0

これが正しいASP.NET 5の方法であるかどうかはわかりませんが、これは本当にうまくいきます...しかし、この回答は受け入れられますが、あなたの例が廃止される可能性のある古い機能に頼っているかどうか教えてください要するに? – Vi100

+0

githubリポジトリで、IFilterFactoryに関連するサンプルを見ることができます(例:https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNet.Mvc.Core/FormatFilterAttribute.cs #L16)... ASP.NET 5はまだ 'beta'になっているので、何も変わっていないことを確かめることはできません。 –

+0

' IAuthorizationFilter'を使用する場合は、 'IAsyncAuthorizationFilter'も実装してください。 –

関連する問題