2008-08-29 128 views
6

我正在写一个应用程序,使用asp.net-mvc部署到iis6。我正在使用表单身份验证。通常,当用户尝试访问资源时没有正确授权,我希望他们被重定向到登录页面。 FormsAuth对我来说很简单。绕过表单身份验证自动重定向到登录,如何?

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

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

注:作为一个测试,我已将此添加到我的Global.asax中,它没有超越窗体身份验证:

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

@Dale和安迪

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

+1

查看http://stackoverflow.com/questions/2839406/forms-authentication-disable-redirect-to-the-login-page – 2013-08-09 05:24:21

回答

5

好的,我解决了这个问题。我做了一个自定义的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登录页面重定向。

+0

我也这么做了。这家伙认为这是正确的做法:http://danielirvine.com/blog/2011/07/18/understanding-403-forbidden – 2011-09-16 13:13:06

-1

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


    HttpContext.Current.Response.StatusCode = 401; 

不知道是否可行与否,我没有测试它。无论哪种方式,值得一试,对吧? :)

0

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

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

这应该有效。我不确定您是否编写了FormsAuth属性,或者您是否从其他位置获取它。

0

我还没有使用Preview 4中的AuthorizeAttribute。我推出了自己的产品,因为自从第一个CTP以来,我一直在使用MVC框架。我快速查看了反射器中的属性,并且正在执行上面我在内部提到的内容,除了它们使用401的十六进制等价物。我将需要进一步查看调用,以查看异常被捕获的位置,因为超过很可能就是他们在做重定向的地方。这是您需要覆盖的功能。我不确定你是否可以做到这一点,但是当我找到它并给你一个解决方法时,我会回复,除非Haacked看到并自己发布。

1

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

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

+0

这对TheDeeno概述的原因没有帮助。 – 2009-04-16 17:00:33