Asp.net mvc 4 mvc 4应用程序中的自定义错误页,使用Windows身份验证设置
我有一个带有windows身份验证的intranet应用程序设置。与大多数应用程序一样,应用程序的某些部分只能由特定角色访问。当不处于所需角色的用户尝试访问该区域时,应向其显示友好的“您无权查看此页面”视图。 我搜索并查看了几个用于扩展Authorize属性的资源。我试过那种方法,但根本不起作用。我仍然会收到IIS错误消息,并且此自定义属性中的断点永远不会被命中。我的扩展attibute中的断点即使在角色中的用户访问页面时也不会被命中。所以,我想知道我是否遗漏了什么? 这就是我所拥有的-Asp.net mvc 4 mvc 4应用程序中的自定义错误页,使用Windows身份验证设置,asp.net-mvc-4,windows-authentication,custom-error-pages,Asp.net Mvc 4,Windows Authentication,Custom Error Pages,我有一个带有windows身份验证的intranet应用程序设置。与大多数应用程序一样,应用程序的某些部分只能由特定角色访问。当不处于所需角色的用户尝试访问该区域时,应向其显示友好的“您无权查看此页面”视图。 我搜索并查看了几个用于扩展Authorize属性的资源。我试过那种方法,但根本不起作用。我仍然会收到IIS错误消息,并且此自定义属性中的断点永远不会被命中。我的扩展attibute中的断点即使在角色中的用户访问页面时也不会被命中。所以,我想知道我是否遗漏了什么? 这就是我所拥有的-
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
private const string IS_AUTHORIZED = "isAuthorized";
public string RedirectUrl = "~Areas/Errors/Http401";
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool isAuthorized = base.AuthorizeCore(httpContext);
httpContext.Items.Add(IS_AUTHORIZED, isAuthorized);
return isAuthorized;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var isAuthorized = filterContext.HttpContext.Items[IS_AUTHORIZED] != null ? Convert.ToBoolean(filterContext.HttpContext.Items[IS_AUTHORIZED]) : false;
if(!isAuthorized && filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl);
}
}
}
控制器-
[AuthorizeRedirect]
[HttpPost, ValidateInput(true)]
public ActionResult NewPart(PartsViewModel vmodel) {..}
有什么想法吗
谢谢我想你可以用自定义错误页面来代替。用于限制调用方对操作方法的访问
[Authorize (Roles="Editor, Moderator", Users="Ann, Gohn")]
public ActionResult RestrictedAction()
{
// action logic
}
然后你可以使用@Marco提出的其中一个。我喜欢在Application\u EndRequest
中处理HTTP状态代码。因此,可以通过以下方法解决您的问题:
protected void Application_EndRequest()
{
int status = Response.StatusCode;
if (Response.StatusCode == 401)
{
Response.Clear();
var rd = new RouteData();
rd.DataTokens["area"] = "Areas";
rd.Values["controller"] = "Errors";
rd.Values["action"] = "Http401";
IController c = new ErrorsController();
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
}
要清楚地指定当HTTP状态代码为错误时现有响应的情况,您应该在配置文件中使用元素的
existingResponse
属性。如果要立即显示错误页面,请使用Replace
value,否则-PassThrough
(请参阅中的详细信息)。此方法的HttpGet版本上是否有[AuthorizeRedirect]?duhh..my bad..它现在正在工作。非常感谢你指出这一点。