0

假设这是我的 SampleController 操作方法

public ActionResult AdminView()
{
    return View()
}

如果希望在登录用户属于管理员角色的情况下调用此控制器方法,否则应阻止此方法调用,并且用户应获得一些自定义的未经授权的访问错误页面。

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

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

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

但我不确定 Authorize 和 Roles 关键字是如何工作的。放置 Roles = "Admin" 时如何帮助检查我存储在会话中的用户角色字符串,或者我如何将用户重定向到未经授权的页面,以防角色与为操作方法标记的角色不匹配。

4

3 回答 3

1

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

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)
    }
}
于 2013-04-04T04:39:31.087 回答
1

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

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。

于 2013-04-04T04:40:58.530 回答
0

此链接中有一个很好的小解释:

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

按照这个:

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

[Authorize] 属性如何将我重定向到登录?

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

IPrincipal user = httpContext.User;

if (!user.Identity.IsAuthenticated)
{
    return false;
}

如果用户认证失败,则返回一个 HttpUnauthorizedResult ActionResult,它会产生一个 HTTP 401(Unauthorized) 状态码。如果不是 ASP.NET Forms Authentication,则会将 HTTP 401 状态代码发送到浏览器,这将显示浏览器的默认登录提示。

于 2013-04-04T04:34:25.810 回答