【问题标题】:C# Route filtersC# 路由过滤器
【发布时间】:2015-03-27 11:57:57
【问题描述】:

我想知道是否有在 Visual C# MVC 中的路由之前添加过滤器。

我有一个Portal 区域,我想检查用户是否登录。

因此人们可以访问Portal/Login,但如果他们尝试访问Portal/Orders 或任何未经授权的内容,我希望能够将他们重定向回Portal/Login

我使用过 PHP 框架,并且是 ASP.NET MVC 的新手。

【问题讨论】:

  • 通常将[Authorize] 属性应用于控制器,然后将[AllowAnonymous] 属性应用于登录/注册方法。解释请参考this article
  • @StephenMuecke 感谢您的链接!但是我有一个 LoginController 和 RegisterController。我闻到这是不好的做法,这在 ASP 中是如何解决的?
  • 通常你只有AccountController,其中包括Login()Register()ChangePassword()等方法。如果你在VS中创建一个带有表单身份验证的新项目,这将全部被创建给你,这样你就可以看看它是如何工作的。
  • 但是我有一个传送门区域,所以有点不同。如果我将 HomeController 与 Login() 操作一起使用,它将无法正常工作,因为在 Portal/Login 上它正在寻找 LoginController..

标签: asp.net-mvc asp.net-mvc-4 routing


【解决方案1】:

[Authorze] 是正确的方向,但我会编写一个自定义授权属性来处理重定向,使您远离内置的Account 控制器。我喜欢 MVC/.NET 如此灵活像这样:)

你可以有一些类似的东西:

public class MyCustomAuthorizeAttribute : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("/controller_name/view_name");
        }
    }


    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
       if (httpContext == null)
            throw new ArgumentNullException("httpContext");

        if (!httpContext.User.Identity.IsAuthenticated)
            return false;

        if (httpContext.User.IsInRole("MyPreferredRole"))
            return true;

        return false;
    }

}

然后,在您的控制器中,您可以使用[MyCustomAuthorize] 而不是[Authorize]AuthorizeCore 方法可以根据您的要求进行定制。我的只是一个例子。例如,您可以将一些相关参数传递给 MyCustomAuthorize 类的构造函数,并在 AuthorizeCore 中验证这些参数。

【讨论】:

    【解决方案2】:

    对于非核心 WebAPI,您将从 System.Web.Http.Filters.AuthorizationFilterAttribute 继承您的自定义授权属性并覆盖 OnAuthorization。

    using System.Web.Http.Controllers;
    using System.Web.Http.Filters;
    .
    .
    public class MyAuthorizeAttribute : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        { ... }
    }
    

    如果OnAuthorization中代码的结果是请求应该被拒绝,设置actionContext.Response。

    actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
    

    不设置响应将导致允许请求继续通过路由。

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2019-07-06
      • 1970-01-01
      • 2014-07-17
      • 2014-12-14
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多