MVC RoleProvider和Authorize属性

And*_*ewC 8 c# asp.net-mvc-2

我已经实现了自己的角色提供程序,而我没有使用默认的角色提供程序.它的工作原理是,它可以告诉某人应该或不应该能够查看页面.

但是,它可以执行以下操作:

  1. 如果用户未登录,请重定向到我的登录页面
  2. 如果用户已登录但没有正确的角色,请重定向到其他页面

我还没有弄清楚如何使用Authorize属性执行此操作,我只有:

[Authorize(Roles="Admin")]
Run Code Online (Sandbox Code Playgroud)

基本上我需要根据授权的哪个部分失败重定向到不同的页面.

我已经看过它是否是web.config中的内容,但没有明显的跳出来.

Oma*_*mar 11

VoodooChild 回答#1.

对于#2 -

您可以做的是检查用户是否登录登录页面并显示不同的消息或完全不同的页面(甚至重定向到不同的操作).

或者,您可以创建自己的授权属性.这将要求您在任何地方使用此属性而不是默认值AuthorizeAttribute

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new RedirectToRouteResult(
                               new RouteValueDictionary 
                               {
                                   { "action", "ActionName" },
                                   { "controller", "ControllerName" }
                               });
        }
        else
            base.HandleUnauthorizedRequest(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

想到另一种方法.当login从不同的页面进行页面重定向时,ReturnUrl也会传递查询字符串.因此,您还可以检查它是否包含某些内容并且用户已通过身份验证,用户可能无权查看该页面.

  • +1.不知道`CustomAuthorizeAttribute`,将不得不尝试一下. (2认同)

Voo*_*ild 7

如果您正在使用FormsAuthentication,那么请回答您的第一个问题 - 是如果用户未经过身份验证或登录,则可以将其重定向到登录页面:

确保你在web.config文件中有这个(不确定你是否需要任何东西,将调查它..)

<authentication mode="Forms">
  <forms loginUrl="~/AccountController/LogOn" timeout="2880" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

要回答第二个问题:"如果用户已登录但没有正确的角色,请重定向到其他页面"

我们这样做的方式是,我们使用该System.Web.Security.Roles.GetRolesForUser(username);方法获取角色,并在此基础上我们将用户重定向到正确的视图,登录后.

希望这可以帮助!