关于asp.net:绕过表单身份验证自动重定向到登录名,怎么办?

关于asp.net:绕过表单身份验证自动重定向到登录名,怎么办?

Bypass Forms Authentication auto redirect to login, How to?

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

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

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

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

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

@戴尔和安迪

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


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

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

HttpForbiddenResult非常简单:

1
2
3
4
5
6
7
8
9
10
11
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基本认证:您必须自己动手做,但是有很多实现。


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


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

1
2
3
4
5
6
7
8
public class FormsAuth : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.Cancel = true;
    }
}

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


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

1
    HttpContext.Current.Response.StatusCode = 401;

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


推荐阅读

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux常用重定向命令?

    linux常用重定向命令?,标准,信息,设备,系统,文件,命令,内容,符号,终端,脚本,l

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux用户组命令设置?

    linux用户组命令设置?,管理,系统,密码,代码,电脑,用户组,用户,软件,新增,命

    linux进入用户命令行?

    linux进入用户命令行?,系统,地址,工作,服务,信息,命令,首页,电脑,密码,终端,L

    linux用户用不了命令?

    linux用户用不了命令?,系统,档案,不了,命令,网络,密码,信息,情况,用户,权限,l

    linux新增用户组命令?

    linux新增用户组命令?,系统,密码,新增,用户组,联系方式,软件,邮箱,工具,管

    linux显示用户名命令?

    linux显示用户名命令?,密码,系统,信息,时间,地址,命令,用户,用户名,位置,用

    linux用户常用命令?

    linux用户常用命令?,工作,地址,系统,信息,管理,目录,命令,标准,基础,常用命

    linux登陆用户的命令?

    linux登陆用户的命令?,系统,密码,工作,用户,命令,代码,第三,信息,分时,用户

    linux重定向命令用法?

    linux重定向命令用法?,标准,设备,系统,人员,信息,文件,命令,终端,内容,符号,L

    linux根用户登录命令?

    linux根用户登录命令?,系统,密码,软件,状态,地址,合法,电脑,位置,检测,工具,L

    linux命令切换用户组?

    linux命令切换用户组?,密码,系统,用户组,命令,用户,文件,信息,目录,终端,所

    linux命令列出用户名?

    linux命令列出用户名?,信息,地址,时间,系统,网络,命令,用户,数据,状态,管理,L

    linux重定向命令输入?

    linux重定向命令输入?,标准,设备,文件,命令,位置,信息,系统,人员,基础知识,