gpt4 book ai didi

c# - 如果我想使用 ASP.NET MVC4 创建 ApiKey 受限资源,我应该使用 IAuthorizationFilter 吗?

转载 作者:IT王子 更新时间:2023-10-29 04:38:01 26 4
gpt4 key购买 nike

我有一些简单的路由,我希望通过一个简单的查询字符串参数来限制它们。如果 key 不正确或未提供,那么我希望抛出一个 NotAuthorizedException

请不要建议我使用 WebApi 或等价物 - 在这种情况下我还不能。

所以我不确定我是否应该实现 IAuthorizationFilter 或实现 IActionFilter 或什至其他东西。

我的代码逻辑?

  • 检查查询字符串中的键。
  • 检查我的 RavenDb(存储库)是否有具有该键/值的用户。

如果他们未通过任何这些检查,则抛出 NotAuthorizedException

我假设我会用这个过滤器装饰我的操作方法。我还假设我还需要将我的存储库传递到此操作方法中?

有什么建议吗?

最佳答案

So i'm not sure if I should be implementing an IAuthorizationFilter or implementing an IActionFilter or even something else.

你应该实现一个 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();
}
}

如果您想在自定义操作过滤器中使用依赖注入(inject),您可以查看 following article您可以在其中实现自定义过滤器提供程序 (IFilterProvider)。你可以有一个标记的属性,你可以在 Controller 操作上使用它,然后让这个自定义过滤器提供者简单地查看操作是否用这个标记属性装饰并应用自定义授权过滤器。

例如:

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());

关于c# - 如果我想使用 ASP.NET MVC4 创建 ApiKey 受限资源,我应该使用 IAuthorizationFilter 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16708942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com