我想知道是否还有在Visual C#MVC中的路由之前添加过滤器。
我有一个Portal
区域,我想检查用户是否登录是/否。
因此,人们可以访问Portal/Login
,但如果他们尝试访问Portal/Orders
或任何未经授权的内容,我希望能够将其重定向回Portal/Login
。
我使用过PHP Frameworks,而且我是ASP.NET MVC的新手。
答案 0 :(得分:0)
[Authorze]
是正确的方向,但我会编写一个自定义授权属性来处理重定向,让您远离Account
内置的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;
}
}
控制器。我喜欢MVC / .NET是这样灵活的:)
你可以有以下几点:
[MyCustomAuthorize]
然后,在您的控制器中,您可以使用[Authorize]
代替AuthorizeCore
。可以根据您的要求自定义MyCustomAuthorize
方法。我只是一个例子。例如,您可以将一些相关的参数传递给AuthorizeCore
类的构造函数,并在{{1}}中验证这些参数。
答案 1 :(得分:0)
对于非核心WebAPI,您将从System.Web.Http.Filters.AuthorizationFilterAttribute继承自定义Authorization属性,并覆盖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);
不设置响应将导致允许请求继续到路由。