我正在使用 VS 2011 开发一个 asp.net MVC 4 应用程序。我有一个带有自定义 AuthorizeAttribute 的自定义角色提供程序来确定用户的角色,如果他们不是特定角色的成员,他们将重定向到拒绝访问页面. 到目前为止,当我使用自定义属性装饰任何控制器操作时,我所做的工作,但是当我将属性添加到控制器时,它会在 IE 和 FF 中出现不同的错误。我的自定义属性:
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public string RedirectActionName { get; set; }
public string RedirectControllerName { get; set; }
private IAccountRepository _accountRepository;
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var user = httpContext.User;
this._accountRepository = new AccountRepository();
var accessAllowed = false;
var allowedRoles = this.Roles.Split(',');
if (!user.Identity.IsAuthenticated)
{
return false;
}
// Get roles for current user
var roles = this._accountRepository.GetRoles(user.Identity.Name);
foreach (var allowedRole in allowedRoles)
{
if (roles.Contains(allowedRole))
{
accessAllowed = true;
}
}
if (!accessAllowed)
{
return false;
}
return base.AuthorizeCore(httpContext);
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.HttpContext.User.Identity.IsAuthenticated && filterContext.Result is HttpUnauthorizedResult)
{
var values = new RouteValueDictionary(new
{
action = this.RedirectActionName == "" ? "AccessDenied" : this.RedirectActionName,
controller = this.RedirectControllerName == "" ? "Home" : this.RedirectControllerName
});
filterContext.Result = new RedirectToRouteResult(values);
}
}
}
我还在 RegisterGlobalFilters 中添加了一个全局属性(我尝试删除它但仍然遇到相同的问题):
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
当我用属性装饰一个动作时,它可以正常工作:
[AccessDeniedAuthorize(RedirectActionName = "AccessDenied", RedirectControllerName = "Home", Roles = "propdat")]
public ActionResult Index()
{
this.ViewBag.Message = "Welcome.";
return this.View();
}
但是当我将它添加到控制器时,它会完全中断:
[AccessDeniedAuthorize(RedirectActionName = "AccessDenied", RedirectControllerName = "Home", Roles = "propdat")]
public class HomeController : Controller
{
public ActionResult Index()
{
this.ViewBag.Message = "Welcome.";
return this.View();
}
public ActionResult AccessDenied()
{
this.ViewBag.Message = "You are not authorised to view this page. Please contact your administrator.";
return this.View();
}
}
这些角色是通过一个看起来不错的存储库从我的数据库返回的。在 IE 中,我得到标准的“Internet Explorer 无法显示网页”错误,而在 Firefox 中出现了一个非常奇怪的错误:
页面未正确重定向
Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。
- 此问题有时可能是由禁用或拒绝接受 cookie 引起的。
在 IE 中,url 保留在 Home url:
http://localhost:1989
但 FF 在 url 更改为我在属性中指定的视图时执行重定向:
http://localhost:1989/Home/AccessDenied