web-dev-qa-db-ja.com

ASP.NET MVC4でApiKey制限付きリソースを作成する場合、IAuthorizationFilterを使用する必要がありますか?

単純なクエリ文字列パラメーターを介して制限したいいくつかの単純なルートがあります。キーが正しくないか提供されていない場合は、NotAuthorizedExceptionをスローします。

私がWebApiまたは同等のものを使用することを勧めないでください-このシナリオではまだできません。

したがって、IAuthorizationFilterを実装する必要があるのか​​、IActionFilterを実装する必要があるのか​​、それ以外の何かを実装する必要があるのか​​どうかはわかりません。

私のコードロジック?

  • キーのクエリ文字列を確認してください。
  • そのキー/値を持つユーザーのRavenDb(リポジトリ)を確認します。

これらのチェックのいずれかが失敗した場合は、NotAuthorizedExceptionをスローします。

次に、このフィルターを使用してアクションメソッドを装飾することを想定しています。また、リポジトリをこのアクションメソッドに渡す必要があると思いますか?

何か提案がありますか?

21
Pure.Krome

したがって、IAuthorizationFilterを実装する必要があるのか​​、IActionFilterを実装する必要があるのか​​、それ以外の何かを実装する必要があるのか​​どうかはわかりません。

IAuthorizationFilterを実装する必要があります:

public class MyAuthorizeAttribute: FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var key = filterContext.HttpContext.Request.QueryString["param_name"];
        if (!IsValid(key))
        {
            // Unauthorized!
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }

    private bool IsValid(string key)
    {
        // You know what to do here => go hit your RavenDb
        // and perform the necessary checks
        throw new NotImplementedException();
    }
}

また、カスタムアクションフィルターに依存関係注入を使用する場合は、カスタムフィルタープロバイダー(IFilterProvider)を実装できる following article を確認できます。コントローラーアクションで使用できるマークされた属性を設定し、このカスタムフィルタープロバイダーに、アクションがこのマーカー属性で装飾されているかどうかを確認させ、カスタム認証フィルターを適用させることができます。

例えば:

public class MyAuthorizeAttribute: Attribute
{

}

承認フィルターはIAuthorizationFilterのみを実装し、FilterAttributeにはなりません:

public class MyAuthorizationFilter: IAuthorizationFilter
{
    private readonly ISomeRepository repository;
    public class MyAuthorizationFilter(ISomeRepository repository)
    {
        this.repository = repository;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var key = filterContext.HttpContext.Request.QueryString["param_name"];
        if (!IsValid(key))
        {
            // Unauthorized!
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }

    private bool IsValid(string key)
    {
        // You know what to do here => go hit your RavenDb
        // and perform the necessary checks
        throw new NotImplementedException();
    }
}

次に、カスタムフィルタープロバイダーを使用します。

public class MyFilterProvider : IFilterProvider
{
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        if (actionDescriptor.GetCustomAttributes(typeof(MyAuthorizeAttribute), true).Any())
        {
            var filter = DependencyResolver.Current.GetService<MyAuthorizationFilter>();
            yield return new Filter(filter, FilterScope.Global);
        }

        yield break;
    }
}

Application_Startに登録されます:

FilterProviders.Providers.Add(new MyFilterProvider());
36
Darin Dimitrov