MVC角色提供程序和授权属性

8

我已经实现了自己的角色提供程序,而不是使用默认的。它可以告诉谁能或不能查看页面。

然而,它能否做到以下几点:

  1. 如果用户未登录,则重定向到我的登录页面
  2. 如果用户已登录但没有正确的角色,则重定向到另一个页面

我还没有找到如何使用Authorize属性来完成此操作,我只有:

[Authorize(Roles="Admin")]

基本上,根据授权失败的部分,我需要重定向到不同的页面。
我已经查看了web.config文件,但没有明显的问题。
2个回答

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 。因此,您还可以检查它是否包含某些内容以及用户是否已经验证,有可能是用户没有权限查看该页面。


2
+1. 不知道CustomAuthorizeAttribute,得试一下。 - VoodooChild

7

就我所知,如果你正在使用FormsAuthentication,则回答你的第一个问题 - 是的。如果用户未经身份验证或登录,则可以将其重定向到登录页面:

确保在web.config文件中有这个设置(不确定是否需要除此之外的任何设置,我将研究一下...)

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

回答你的第二个问题:“如果用户已登录但没有正确的角色,则重定向到另一个页面”
我们的做法是使用 System.Web.Security.Roles.GetRolesForUser(username); 方法获取角色,并根据此重定向用户到正确的视图,登录后即可。
希望这能帮到你!

我认为如果用户没有适当的角色来查看某个操作,那么该用户也会被重定向到登录页面。 - Omar
@Omar,这是正确的,如果您已经登录,这有点奇怪。我想我可以在登录页面上添加重定向检查,但这会让人感觉很不舒服。 - AndrewC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接