Asp.net 401未经授权的现场处理(无重定向)? 问题

Asp.net 401未经授权的现场处理(无重定向)? 问题,asp.net,asp.net-mvc,authentication,forms-authentication,authorize-attribute,Asp.net,Asp.net Mvc,Authentication,Forms Authentication,Authorize Attribute,当IIS 7.0上的ASP.NET MVC 5应用程序中的iaAuthorizationFilter失败时,直接返回401并登录页面、避免302重定向的简单方法是什么?我必须实现什么样的基础结构才能使其正常工作 可能的替代问题:这是个坏主意吗 - 背景 我实现了,以解决由FormsAuthentication引起的AJAX问题。它将所有未经授权的401转换为找到的302(即重定向)。然而,这导致了额外的问题,因为现在所有302个重定向都转换为401个。所以为了解决这个问题,我去掉了500服务器错

当IIS 7.0上的ASP.NET MVC 5应用程序中的
iaAuthorizationFilter
失败时,直接返回401并登录页面、避免302重定向的简单方法是什么?我必须实现什么样的基础结构才能使其正常工作

可能的替代问题:这是个坏主意吗

-

背景 我实现了,以解决由
FormsAuthentication
引起的AJAX问题。它将所有未经授权的
401
转换为找到的
302
(即重定向)。然而,这导致了额外的问题,因为现在所有302个重定向都转换为401个。所以为了解决这个问题,我去掉了
500服务器错误的重定向,以及
404找不到的重定向,我想还有一些我错过了

也许我设计得太过火了,但在这个练习之后,一开始就把302换成401似乎是不正确的。解决了一个问题,创造了新的问题。我认为技术上最理想的答案是处理401计划。然后服务器发送一个诚实的状态代码,不管是否是AJAX,如果AJAX客户机接收到登录HTML,这没什么大不了的

-

我的进步 不使用FormsAuthentication而使用FormsAuthentication cookies

我尝试了一种方法,使用:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <error statusCode="401" responseMode="ExecuteURL" path="/Account/AuthReq" />
</httpErrors>
似乎我可以避免对Web.Config中FormsAuthentication的依赖,并且仍然能够使用OEM加密的票据,只需利用
FormsAuthentication.Decrypt()
而不是
HttpContext.User.Identity
我在上面所做的。我还没有调查这一变化是否与MVC5中相当新的基于声明的票证或非常新的AuthenticationFilter有关

使用AppHarbor的.NET开放式身份验证库

虽然我不确定这是否适用于我的场景,但这里对类似主题的一些回答表明,不可能禁用FormsAuthentication的302重定向操作。不过,ASP.NET中显然没有其他身份验证机制

AppHarbor已将替换库发布到,并在上进行了讨论。

签出该属性

然后写入自定义授权属性:

public class MyAuthorizeAttribute: AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
        filterContext.Result = new ViewResult
        {
            ViewName = "~/Views/Account/Login.cshtml",
        };
    }
}
可用于装饰受保护的控制器/操作,包括:

[MyAuthorize]
public ActionResult Admin()
{
    return View();
}

显然,如果您不想让web.config中的401状态代码的自定义错误页占据主导地位,您可能还想删除这些错误页。

。我已经有一个海关许可证了。谢谢你,达林。我还是希望在这里定义登录操作的路径,而不是在Web.config的
httpErrors
部分,因为后者不接受项目相对路径。
[MyAuthorize]
public ActionResult Admin()
{
    return View();
}