我已经实现了自己的角色提供程序,而不是使用默认的。它可以告诉谁能或不能查看页面。
然而,它能否做到以下几点:
- 如果用户未登录,则重定向到我的登录页面
- 如果用户已登录但没有正确的角色,则重定向到另一个页面
我还没有找到如何使用Authorize属性来完成此操作,我只有:
[Authorize(Roles="Admin")]
基本上,根据授权失败的部分,我需要重定向到不同的页面。
我已经查看了web.config文件,但没有明显的问题。
我已经实现了自己的角色提供程序,而不是使用默认的。它可以告诉谁能或不能查看页面。
然而,它能否做到以下几点:
我还没有找到如何使用Authorize属性来完成此操作,我只有:
[Authorize(Roles="Admin")]
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
。因此,您还可以检查它是否包含某些内容以及用户是否已经验证,有可能是用户没有权限查看该页面。
就我所知,如果你正在使用FormsAuthentication,则回答你的第一个问题 - 是的。如果用户未经身份验证或登录,则可以将其重定向到登录页面:
确保在web.config文件中有这个设置(不确定是否需要除此之外的任何设置,我将研究一下...)
<authentication mode="Forms">
<forms loginUrl="~/AccountController/LogOn" timeout="2880" />
</authentication>
System.Web.Security.Roles.GetRolesForUser(username);
方法获取角色,并根据此重定向用户到正确的视图,登录后即可。
CustomAuthorizeAttribute
,得试一下。 - VoodooChild