Asp.net mvc 4 如何简单地从HandleUnauthorizedRequest方法设置ModelStateError?

Asp.net mvc 4 如何简单地从HandleUnauthorizedRequest方法设置ModelStateError?,asp.net-mvc-4,authorization,modelstate,Asp.net Mvc 4,Authorization,Modelstate,因此,发生的情况是,我在自定义authorize属性中的HandleUnauthorizedRequest方法覆盖范围内有一个条件。到目前为止,我一直在抛出一个403,它被拾取并重定向到一个自定义错误页面。那不是我想要的。我真正想要的是显示相同的登录页面,但在验证摘要中添加一条消息“您没有访问此资源的权限”,这样更方便用户。这表明你的信誉很好,但你不属于这里 我认为这样做会奏效: protected override void HandleUnauthorizedRequest(Authoriz

因此,发生的情况是,我在自定义authorize属性中的HandleUnauthorizedRequest方法覆盖范围内有一个条件。到目前为止,我一直在抛出一个403,它被拾取并重定向到一个自定义错误页面。那不是我想要的。我真正想要的是显示相同的登录页面,但在验证摘要中添加一条消息“您没有访问此资源的权限”,这样更方便用户。这表明你的信誉很好,但你不属于这里

我认为这样做会奏效:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    // passed authentication, failed authorization
    if (filterContext.HttpContext.User.Identity.IsAuthenticated)
    {           
        filterContext.Controller.ViewData.ModelState.AddModelError("", "Not Authorized");
        return;
    }

    base.HandleUnauthorizedRequest(filterContext);
}
但这不起作用。发生的情况是登录页面只是重新加载。所以这让我觉得我很接近,但我需要模型错误来显示

有什么想法吗

更新:
看起来,我在这里添加错误的控制器实际上是具有导致此处的属性的任何操作的控制器。我需要以某种方式将错误添加到登录控制器。不确定这是否可行。

您正在这里调用基本方法:

base.HandleUnauthorizedRequest(filterContext);
如果您使用的是表单身份验证,此基本方法只会将您重定向到登录页面。重定向意味着来自客户端的新HTTP请求。当前上下文和存储在其中的内容将丢失。更准确地说,基本方法返回401 HTTP状态代码,然后FormsAuthenticationModule会截取该代码,并将其重定向到web.config中定义的登录页面。但这一实施细节并不重要

您可以做的是将自己重定向到登录页面,而不是将其留给基本方法。您可以通过将
filterContext.Result
属性设置为
RedirectToRouteResult
实例来实现这一点。在这种情况下,可以将错误消息作为查询字符串参数传递


更新:


根据您更新的问题,您似乎正在调用
returnfilterContext.Result
设置为
ViewResult
的实例来返回一些错误视图,在该视图中,您可以使用存储在ModelState中的值。

对不起,实际上,我在设置模型错误后返回了一个值。将错误作为查询字符串传递的问题(我已经尝试过了)是,如果您再次尝试输入creds,它将重新加载该url而不使用查询字符串,因此根本没有消息是的,但是如果您只返回将呈现的视图?您从未设置过
filterContext.Result
属性。如果要呈现某些常规错误视图,可以将其设置为
ViuewResult
的实例。在这种情况下,您可以在这个视图中使用ModelState值。True,但我不想要一个通用的错误视图。我只想在登录页面上显示一个错误。但是登录页面不会显示。您通过不调用基方法禁用了它。如果你想重定向,你可以使用查询字符串参数,也可以使用TempData,但就我个人而言,我会使用查询字符串参数。我抛出一个HttpError,将该错误重定向到一个错误操作,该操作将错误存储到临时数据中。然后登录页面读取它并将其添加到modelstate