我想知道是否有办法在Visual C# MVC中的路由前添加一个过滤器。
我有一个 Portal
我想检查用户是否已登录的区域是no。
所以人们可以访问 Portal/Login
但如果他们试图访问 Portal/Orders
或任何未经授权的内容,我希望能够将他们重定向回 Portal/Login
.
我曾经使用过PHP框架,我是ASP.NET MVC的新手。
[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
.
对于非核心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将导致允许请求继续通过路由。