C#路由过滤器

问题描述 投票:0回答:2

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

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

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

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

asp.net-mvc asp.net-mvc-4 routing
2个回答
0
投票

[Authorze] 是正确的方向,但我会写一个自定义的授权属性,以处理重定向(S),打破你从的 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.


0
投票

对于非核心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);

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

© www.soinside.com 2019 - 2024. All rights reserved.