ASP.NET MVC角色和安全性
假设这是我的SampleController动作方法
public ActionResult AdminView() { return View() }
如果要登录的用户属于admin角色,则需要调用此控制器方法,否则应该阻止此方法调用,并且用户应该获得一些自定义的未经授权的访问错误页面。
在我的asp .net mvc Web应用程序中,当用户登录时,我将用户角色作为字符串存储在会话中。 每当需要validation用户角色时,我会将会话中存储的值与常量“ADMIN_ROLE”进行比较。 但是我正在编写这段代码来检查几乎每个控制器操作方法中的用户角色,然后为用户返回适当的视图,或者如果用户角色限制为控制器操作方法,则返回未授权的访问页面视图。
我用谷歌搜索并读到我们可以使用这样的东西。
[Authorize(Roles="admin")] public ActionResult AdminView() { return View() }
但我不确定Authorize和Roles关键字的工作原理。 如果角色与为操作方法标记的角色不匹配,那么在设置Roles =“Admin”时,如何帮助检查存储在会话中的用户角色字符串,或者如何将用户重定向到未授权的页面。
根据我的想法,您需要编写授权代码。
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter { private readonly RoleEnum[] _acceptedRoles; public AuthorizeAttribute(params RoleEnum[] acceptedroles) { _acceptedRoles = acceptedroles; } public AuthorizeAttribute(params bool[] allowAll) { if (allowAll[0]) _acceptedRoles = new RoleEnum[] { RoleEnum.Admin, RoleEnum.user}; } public void OnAuthorization(AuthorizationContext filterContext) { if (SessionHelper.UserInSession == null)//user not logged in { FormsAuthentication.SignOut(); filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary {{ "controller", "Home" }, { "action", "Index" }, { "returnUrl", filterContext.HttpContext.Request.RawUrl } });//send the user to login page with return url return; } if (!_acceptedRoles.Any(acceptedRole => SessionHelper.UserInSession.UserRoles.Any(currentRole => acceptedRole == currentRole.Role))) //allow if any of the user roles is among accepted roles. Else redirect to login page throw new UnauthorizedAccessException(); } }
这也适用于返回URL。
根据评论,如果您使用自定义身份validation/授权机制,则需要实现自定义授权属性,您可以在其中放置自定义逻辑以检查用户是否具有管理员角色。 如下所示:
public class CustomizedAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //check for role in session variable "ADMIN_ROLE" //if not valid user then set filterContext.Result = new RedirectResult(URL) } }
这个链接有一个很好的解释:
按此:
ASP.NET MVC包含[Authorize]属性,当置于任何控制器操作时,将禁止未经授权的访问。 AuthorizeAttribute允许您指定角色或用户列表。 您还可以将AuthorizeAttribute放在控制器上,在这种情况下,它将应用于控制器中的所有操作。 当您未登录时,尝试访问AuthorizeAttribute保护的操作将带您进入标准的LogOn屏幕,如果您还没有帐户,则需要注册链接。
[Authorize]属性如何将我重定向到登录?
AuthorizeAttribute是一个ActionFilter,这意味着它可以在关联的控制器操作之前执行。 AuthorizeAttribute在OnAuthorization方法中执行其主要工作,该方法是IAuthorizationFilter接口中定义的标准方法。 检查MVC源代码,我们可以看到底层安全检查实际上只是查看ASP.NET上下文所持有的基础身份validation信息:
IPrincipal user = httpContext.User; if (!user.Identity.IsAuthenticated) { return false; }
如果用户validation失败,则返回HttpUnauthorizedResult ActionResult,生成HTTP 401(未授权)状态代码。 如果不是ASP.NET Forms Authentication,则会向浏览器发送HTTP 401状态代码,该代码将显示浏览器的默认登录提示。