ASP.. NET MVC角色和安全性

本文关键字:安全性 角色 MVC NET ASP | 更新日期: 2023-09-27 18:07:23

假设这是我的SampleController动作方法

public ActionResult AdminView()
{
    return View()
}

如果想要这个控制器方法被调用,如果登录的用户属于admin角色,否则这个方法调用应该被阻止,用户应该得到一个自定义的未经授权的访问错误页面。

在我的asp.net mvc web应用程序中,当用户登录时,我将用户角色存储在会话中作为字符串。每当需要验证用户角色时,我将会话中存储的值与常量"ADMIN_ROLE"进行比较。但是我正在编写这段代码来检查几乎每个控制器操作方法中的用户角色,然后返回用户的适当视图或未经授权的访问页面视图,如果用户角色受到控制器操作方法的限制。

我在谷歌上搜索到我们可以使用这样的东西。

[Authorize(Roles="admin")]
public ActionResult AdminView()
{
  return View()
}

但是我不确定授权和角色关键字是如何工作的。如何当把角色= "Admin",将有助于检查我的用户角色字符串存储在会话中,或者我如何可以重定向用户到未经授权的页面,以防角色不匹配的角色标记的动作方法。

ASP.. NET MVC角色和安全性

根据我的想法,你需要为授权编码。

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();
    }
}

根据评论,如果您使用自定义认证/授权机制,那么您需要实现自定义授权属性,您可以在其中放置自定义逻辑来检查用户是否具有管理员角色。如下所示:

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)
    }
}

这个链接有一个很好的解释:

http://weblogs.asp.net/jgalloway/archive/2011/04/28/looking-at-how-asp-net-mvc-authorize-interacts-with-asp-net-forms-authorization.aspx

按this:

ASP。. NET MVC包含一个[Authorize]属性,当它被放置在任何控制器动作上时,将禁止未经授权的访问。AuthorizeAttribute允许您指定角色或用户列表。您还可以将AuthorizeAttribute放在控制器上,在这种情况下,它将应用于控制器中的所有操作。当您未登录时,尝试访问由AuthorizeAttribute保护的操作将带您到一个标准的LogOn屏幕,如果您还没有帐户,则有一个注册链接。

[authorization]属性如何重定向到Log On?

AuthorizeAttribute是一个ActionFilter,这意味着它可以在关联的控制器动作之前执行。AuthorizeAttribute在OnAuthorization方法中执行其主要工作,该方法是IAuthorizationFilter接口中定义的标准方法。检查MVC源代码,我们可以看到底层的安全检查实际上只是查看ASP持有的底层身份验证信息。网络环境:

IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
    return false;
}

如果用户认证失败,返回HttpUnauthorizedResult ActionResult,生成HTTP 401(Unauthorized)状态码。如果没有ASP。NET Forms Authentication时,将向浏览器发送HTTP 401状态码,该状态码将显示浏览器的默认登录提示符。