繁体   English   中英

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

[英]Bypass Forms Authentication auto redirect to login, How to?

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

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

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

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

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

@Dale和Andy

我正在使用MVC预览4中提供的AuthorizeAttributeFilter。这将返回一个HttpUnauthorizedResult。 这个结果正确地将statusCode设置为401.正如我所理解的那样,问题是asp.net正在拦截响应(因为它被调为401)并重定向到登录页面而不是让它通过。 我想绕过某些网址拦截。

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

为了避免重定向,HttpForbiddenResult使用状态代码403标记响应.FormsAuthentication不会捕获使用此代码的响应,因此有效地跳过了登录重定向。 NoFallBackAuthorize过滤器检查用户是否被授权,与包含的授权过滤器非常相似。 它的不同之处在于它在拒绝访问时返回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中的登录页面重定向。

可能是一个kludge(甚至可能不工作),但在你的登录页面上看看Request.QueryString["ReturnUrl"] != null如果是这样设置Response.StatusCode = 401

请记住,您仍然需要让您的控制台应用程序以某种方式进行身份验证。 您没有免费获得HTTP基本身份验证:您必须自己动手,但有很多实现。

您是否为该操作编写了自己的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看到并自己发布。

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


    HttpContext.Current.Response.StatusCode = 401;

不确定它是否有效,我还没有测试过。 无论哪种方式,都值得一试,对吗? :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM