我有一个无法解决的情况:
我正在为我的mvc创建自己的自定义授权属性。我要添加的功能的主要方面是,如果用户没有特定角色,则可以更改其重定向位置。我不介意如果未通过身份验证,系统会将它们发送回登录页面,但是我想选择如果已通过身份验证但不允许访问该操作方法的位置,则将它们发送到哪里。
这是我想做的事情:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public string Action;
public string Controller;
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
// if User is authenticated but not in the correct role
string url = Url.Action(this.Action, this.Controller);
httpContext.Response.Redirect(url);
}
}
另外,我想在重定向之前可以访问ViewContext和TempData。
关于如何在属性中实例化UrlHelper和ViewContext的任何想法?
最佳答案
您可以覆盖OnAuthorization
方法:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
// Call the AuthorizeCore which should return true or false
if (!this.AuthorizeCore(filterContext.HttpContext))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary()
{
{ "controller", "home" },
{ "action", "about" },
{ "id", "foo" },
});
}
}
就ViewData和TempData而言:
filterContext.Controller.ViewData
和filterContext.Controller.TempData
应该在OnAuthorization
方法中起作用。最后,如果您希望使用UrlHelper
(在这种情况下,因为RedirectToRouteResult
更好,因此不需要),可以实例化它:var urlHelper = new UrlHelper(filterContext.RequestContext);