绕过表单身份验证自动重定向到登录,如何?

时间:2020-03-05 18:45:14  来源:igfitidea点击:

我正在使用asp.net-mvc部署到iis6编写应用程序。我正在使用表单身份验证。通常,当用户尝试未经适当授权访问资源时,我希望将他们重定向到登录页面。 FormsAuth对我来说很容易做到这一点。

问题:现在我有一个控制台应用程序正在访问的动作。什么是使此操作响应状态401而不是将请求重定向到登录页面的最快方法?

我希望控制台应用程序能够对此401 StatusCode做出反应,而不是透明的。我还想保留默认值,将未经授权的请求重定向到登录页面行为。

注意:作为测试,我将其添加到global.asax中,它没有绕过表单身份验证:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpContext.Current.SkipAuthorization = true;
}

@戴尔和安迪

我正在使用MVC预览版4中提供的AuthorizeAttributeFilter。这将返回HttpUnauthorizedResult。此结果正确地将statusCode设置为401. 据我所知,问题是asp.net正在拦截响应(因为其标记为401)并重定向到登录页面,而不仅仅是让它通过。我想绕过某些网址的拦截。

解决方案

回答

我做了一些谷歌搜索,这是我想出的:

HttpContext.Current.Response.StatusCode = 401;

不知道它是否有效,我还没有测试过。无论哪种方式,都值得尝试,对吧? :)

回答

我们是否为该操作编写了自己的FormsAuth属性?如果是这样,则可以在OnActionExecuting方法中传递FilterExecutingContext。我们可以使用它来传回401代码。

public class FormsAuth : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.Cancel = true;
    }
}

这应该工作。我不确定我们是否编写了FormsAuth属性,还是从其他地方获取的。

回答

我还没有使用预览版4中的AuthorizeAttribute。我自己动手了,因为自从第一个CTP开始就一直在使用MVC框架。我快速看了一下反射器中的属性,它在内部做我上面提到的事情,只是它们使用的是401的十六进制等效项。我将需要进一步查找该调用,以了解在何处捕获了异常,因为可能是他们在进行重定向的地方。这是我们将需要覆盖的功能。我不确定我们是否可以这样做,但是找到后我会回发,并给我们解决,除非Haacked看到并亲自张贴。

回答

好的,我解决了这个问题。我做了一个自定义的ActionResult(HttpForbiddenResult)和自定义的ActionFilter(NoFallBackAuthorize)。

为了避免重定向,HttpForbiddenResult用状态代码403标记响应。FormsAuthentication不会捕获此代码的响应,因此有效地跳过了登录重定向。 NoFallBackAuthorize过滤器检查用户的授权是否类似于所包含的Authorize过滤器。区别在于访问被拒绝时它返回HttpForbiddenResult。

HttpForbiddenResult非常简单:

public class HttpForbiddenResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

在FormsAuthenticationModule中似乎无法跳过登录页面重定向。

回答

可能有点麻烦(甚至可能不起作用),但是在登录页面上查看Request.QueryString [" ReturnUrl"]!= null,如果设置为" Response.StatusCode = 401"。

请记住,我们仍然需要获取控制台应用程序以某种方式进行身份验证。我们不会免费获得HTTP基本认证:我们必须自己动手做,但是有很多实现。