ASP.NET MVC角色和安全(ASP.NET MVC Roles and Security)

2019-08-19 09:09发布

假设像这是我SampleController操作方法

public ActionResult AdminView()
{
    return View()
}

如果想如果登录的用户属于管理员角色被称为该控制器的方法,否则此方法调用应该阻止用户应该得到一些自定义的未经授权的访问错误页面。

在我的ASP.NET MVC Web应用程序,当,我存储在会话作为字符串用户角色的用户登录。 每当有需要验证用户的角色,我比较存储在针对恒定会话价值说“ADMIN_ROLE”。 但我写一段代码,在几乎每一个控制器的操作方法检查用户角色,然后要么返回一个合适的视图为用户或用户角色的控制器的操作方法限制未经授权的访问页视图。

我用Google搜索和阅读,我们可以使用这样的事情。

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

但我不知道的授权和角色的关键字是如何工作的。 把角色=“管理员”的时候怎么样,是要在检查我的用户角色的字符串存储在会话,或者我如何可以重定向用户到未经授权的网页,如果角色不匹配标记的操作方法的作用,帮助。

Answer 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。



Answer 2:

按照意见,如果您正在使用自定义的认证/授权机制,那么你需要实现自定义授权属性,你可以把自定义逻辑检查,如果用户具有管理员角色或没有。 类似下面:

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


Answer 3:

有一个在这个环节小很好的解释:

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包括[授权]属性,其中,当放置在任何的控制器操作将禁止未经授权的访问。 该AuthorizeAttribute允许您指定的角色或用户的列表。 您也可以将AuthorizeAttribute控制器,在这种情况下,将适用于在控制器的所有动作上。 试图访问由AuthorizeAttribute固定的动作,当你没有登录会带你到一个标准的登录屏幕,用一个链接,如果你不已经有一个帐户进行注册。

如何在[授权]属性重定向我登录?

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

IPrincipal user = httpContext.User;

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

如果用户认证失败,一个HttpUnauthorizedResult ActionResult的返回,产生一个HTTP 401(未授权)状态代码。 如果它不是为ASP.NET窗体身份验证,一个HTTP 401状态码会被发送到浏览器,它会显示浏览器的默认登录提示。



文章来源: ASP.NET MVC Roles and Security