6

我正在编写一个使用 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)并重定向到登录页面,而不是让它通过。我想绕过对某些 url 的拦截。

4

5 回答 5

5

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

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

HttpForbiddenResult 非常简单:

公共类 HttpForbiddenResult : ActionResult
{
    公共覆盖无效ExecuteResult(ControllerContext上下文)
    {
        如果(上下文 == 空)
        {
            抛出新的 ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

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

于 2008-08-30T00:36:31.093 回答
1

可能是一团糟(甚至可能不起作用),但在您的登录页面上查看是否Request.QueryString["ReturnUrl"] != null设置Response.StatusCode = 401

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

于 2008-08-30T00:38:02.850 回答
0

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

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

这应该有效。我不确定您是编写了 FormsAuth 属性还是从其他地方获得的。

于 2008-08-29T21:33:07.010 回答
0

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

于 2008-08-29T22:23:37.403 回答
-2

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


    HttpContext.Current.Response.StatusCode = 401;

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

于 2008-08-29T21:28:12.950 回答