我有一个使用ASP.Net MVC3并使用角色成员资格的项目。我在每个控制器中使用授权。 例如:
[Authorize(Roles = "Administrator")]
public ActionResult Index(string q, int i)
{
return View(model);
}
如果某人没有管理员角色,则默认情况下会重定向到登录页面。如何更改它,所以它将重定向到Views / Shared / UnAuthorize.cshtml?或者如果有人没有管理员的角色,它会显示消息框(警告)?
提前谢谢。答案 0 :(得分:23)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
public class MyAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
//you can change to any controller or html page.
filterContext.Result = new RedirectResult("/cpanel/roles/unauthorize");
}
}
并将MyAuthorize应用于类或操作:
[MyAuthorize]
public class AdminController :Controller
{
}
就是这样。
答案 1 :(得分:12)
只需更改必须在web.config中显示的页面(检查路由是否存在)
<authentication mode="Forms">
<forms loginUrl="~/UnAuthorize" timeout="2880" />
</authentication>
如果您希望重定向到每个角色的特定路径,则可以使用您自己的角色扩展AuthorizeAttribute。像这样的东西(没有经过测试,我写这个给你一个想法)
public class CheckAuthorize : ActionFilterAttribute
{
public Roles[] Roles { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//Your code to get the user
var user = ((ControllerBase)filterContext.Controller).GetUser();
if (user != null)
{
foreach (Role role in Roles)
{
if (role == user.Role)
return;
}
}
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
if user.Role==Role.Administrator
{
redirectTargetDictionary.Add("action", "Unauthorized");
redirectTargetDictionary.Add("controller", "Home");
}
else
{
redirectTargetDictionary.Add("action", "Logon");
redirectTargetDictionary.Add("controller", "Home");
}
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
}
答案 2 :(得分:3)
好吧,您可以继承AuthorizeAttribute
并覆盖HandleUnauthorizedRequest
,它负责重定向未经授权/未经身份验证的请求。我认为this question会对你有所帮助
答案 3 :(得分:1)
我自己的版本,基于ntep伏特加的:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if(IsUserAuthenticated(filterContext.HttpContext))
{
filterContext.Result = new RedirectResult("/Account/InvalidRole");
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
private bool IsUserAuthenticated(HttpContextBase context)
{
return context.User != null && context.User.Identity != null && context.User.Identity.IsAuthenticated;
}
}
通过这种方式,我可以为未经过身份验证的用户获得标准重定向到登录页面,并为经过身份验证但没有相应角色的用户进行自定义重定向。
答案 4 :(得分:1)
下面的代码有帮助,这里是stackoverflow中的引用 ASP.NET MVC 4 custom Authorize attribute - How to redirect unauthorized users to error page?
public class CustomAuthorize: AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" }));
}
}
}
答案 5 :(得分:0)