単純なクエリ文字列パラメーターを介して制限したいいくつかの単純なルートがあります。キーが正しくないか提供されていない場合は、NotAuthorizedException
をスローします。
私がWebApiまたは同等のものを使用することを勧めないでください-このシナリオではまだできません。
したがって、IAuthorizationFilter
を実装する必要があるのか、IActionFilter
を実装する必要があるのか、それ以外の何かを実装する必要があるのかどうかはわかりません。
私のコードロジック?
これらのチェックのいずれかが失敗した場合は、NotAuthorizedException
をスローします。
次に、このフィルターを使用してアクションメソッドを装飾することを想定しています。また、リポジトリをこのアクションメソッドに渡す必要があると思いますか?
何か提案がありますか?
したがって、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());