MVC RoleProvider和Authorize属性

时间:2011-01-12 00:39:18

标签: c# asp.net-mvc-2

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

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

  1. 如果用户未登录,请重定向到我的登录页面
  2. 如果用户已登录但没有正确的角色,请重定向到其他页面
  3. 我还没有弄清楚如何使用Authorize属性执行此操作,我只有:

    [Authorize(Roles="Admin")]
    

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

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

2 个答案:

答案 0 :(得分: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);
    }
}

更新

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

答案 1 :(得分:7)

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

确保你在web.config文件中有这个(不确定除此之外是否需要任何东西,会查看它..)

<authentication mode="Forms">
  <forms loginUrl="~/AccountController/LogOn" timeout="2880" />
</authentication>

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

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

希望这有帮助!