ASP.NET MVC 4自定义授权属性 - 如何将未经授权的用户重定向到错误页面?
ASP.NET MVC 4自定义授权属性 - 如何将未经授权的用户重定向到错误页面?
我正在使用自定义的授权属性根据用户的权限级别来授权其访问。我需要将未经授权的用户(例如,用户尝试在没有删除访问级别的情况下删除发票)重定向到访问被拒绝的页面。
自定义属性是有效的。但是在未经授权的用户访问的情况下,浏览器中没有显示任何内容。
控制器代码。
public class InvoiceController : Controller { [AuthorizeUser(AccessLevel = "Create")] public ActionResult CreateNewInvoice() { //... return View(); } [AuthorizeUser(AccessLevel = "Delete")] public ActionResult DeleteInvoice(...) { //... return View(); } // 更多代码/方法等。 }
自定义属性类代码。
public class AuthorizeUserAttribute : AuthorizeAttribute { // 自定义属性 public string AccessLevel { get; set; } protected override bool AuthorizeCore(HttpContextBase httpContext) { var isAuthorized = base.AuthorizeCore(httpContext); if (!isAuthorized) { return false; } string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // 调用另一个方法从数据库中获取用户的权限 if (privilegeLevels.Contains(this.AccessLevel)) { return true; } else { return false; } } }
如果您能分享您在此方面的经验,我将不胜感激。
ASP.NET MVC 4中的自定义授权属性——如何将未授权的用户重定向到错误页面?
在ASP.NET MVC 4中,我们经常需要对用户进行授权,以确保他们只能访问他们被授权的页面。为了实现这一目的,我们可以使用AuthorizeAttribute类来创建自定义授权属性。然而,当用户未经授权尝试访问受保护的页面时,我们可能希望将他们重定向到一个错误页面。
要实现这个功能,我们需要重写AuthorizeAttribute类中的HandleUnauthorizedRequest方法。具体操作如下:
public class CustomAuthorize : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if(!filterContext.HttpContext.User.Identity.IsAuthenticated) { base.HandleUnauthorizedRequest(filterContext); } else { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" })); } } }
上述代码中,我们首先检查用户是否已经通过身份验证。如果用户未经身份验证,则调用base.HandleUnauthorizedRequest方法,该方法将默认显示未授权的错误信息。如果用户已经通过身份验证,则将用户重定向到名为"Error"的控制器的"AccessDenied"动作。
需要注意的是,为了确保线程安全性,我们应该使用以下条件语句:
if(false == filterContext.HttpContext.User.Identity.IsAuthenticated)
此外,如果重定向的目标动作需要参数,我们可以通过以下方式将参数传递给该函数:
AccessDenied(string PermissionNeeded)
以上是解决ASP.NET MVC 4中自定义授权属性如何将未授权的用户重定向到错误页面的方法。如果您想了解更多关于此问题的信息,可以参考Ben Cull在stackoverflow上的回答(链接在上方提供)。