Asp.net mvc 4 mvc 4应用程序中的自定义错误页,使用Windows身份验证设置

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中的断点即使在角色中的用户访问页面时也不会被命中。所以,我想知道我是否遗漏了什么? 这就是我所拥有的-

我有一个带有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..它现在正在工作。非常感谢你指出这一点。