【问题标题】:Add authorization to a specific route without adding attribute in mvc向特定路由添加授权而不在 mvc 中添加属性
【发布时间】:2018-10-15 17:33:17
【问题描述】:

我需要在不添加 Authorize 属性的情况下为特定路由添加授权。有什么办法可以在启动时做到这一点?我知道我可以将 Authorize 属性全局添加到所有路由,但我需要仅将授权添加到控制器中的特定方法,而无需触及该控制器中的任何代码。

【问题讨论】:

  • 您可以通过在您希望的方法上使用 [Authorize] 标签来为方法添加授权
  • 这可能是重新审视“不接触该控制器中的任何代码”要求的好时机。似乎无论你做什么,它都会成为一个 hack,这将使未来的调试和支持变得不必要地困难。为什么你想在不改变代码的情况下改变某事物的行为?
  • 你不想更新控制器的原因是什么?
  • 如果是这种情况,您可以扩展 AuthorizeAttribute,也可以创建一个 HttpModule 来处理请求。

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

如果您无法触摸代码,我会看到唯一的解决方案 - 使用中间件进行检查。假设您要限制访问的路由是 POST '/users/register',因此您可以在启动时使用全局注册的 ActionFilter 来检查 url,如果它的 url 是 '/users/register',则您正在尝试检查令牌和如果令牌无效 - 返回 401。

你也可以使用 Owin 中间件

这是使用 ActionFilter 实现此类逻辑的简单示例

public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configuration.Filters.Add(new CheckAuthorizationFilterAttribute());
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
    public class CheckAuthorizationFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var requestUri = actionContext.Request.RequestUri.AbsolutePath;
            if (requestUri == "/api/users/register")
            {
                var isTokenValid = ValidateToken();
                if (!isTokenValid)
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                return;
            }
        }

        public bool ValidateToken() => false;

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {

        }
    }

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多