基本身份验证重定向到登录页面,而不是返回身份验证质询

本文关键字:身份验证 返回 重定向 登录 | 更新日期: 2023-09-27 18:36:51

除了标准的开箱即用cookie/表单身份验证外,我还需要支持SignalR的HTTPS基本身份验证。SignalR 在混合 MVC/WebApi 站点的上下文中运行。

在将如何实现这一点放在一起之后,我在服务器上使用了ThinkTecture.IdentityModel.Owin.BasicAuthentication库,如下所示:

app.Map("/basicauth", map =>
{
    map.UseBasicAuthentication("realm", ValidateUser);
    map.MapSignalR<AuthenticatedEchoConnection>("/echo");
    map.MapSignalR();
});

但是,我总是收到重定向到 MVC 站点的登录页面的 HTTP 302 响应,而不是返回质询。为了更好地调试它,我快速推出了自己的简单 OWIN 中间件进行基本身份验证,并得到了相同的结果。使用如下简单映射进行进一步测试:

app.Map("/test", map =>
    {
        map.Use((context, next) =>
            {
                // context.Response.StatusCode = 401;
                context.Response.Write("Hello World!");
                return Task.FromResult(0);
            });

透露,一个简单的"Hello World"响应正常返回。但是当我注释掉将响应代码设置为 401 的行时,我再次重定向到登录页面。我不明白这种行为...为什么我的 MVC 站点在此处参与而不返回 401 响应?我该如何防止这种情况?

对于 OWIN,除了上面的特殊/basicauth映射之外,我在启动方法中只定义了顶级 SignalR 映射,该映射应继续适用于所有经过 cookie 身份验证的调用:

app.MapSignalR();

我没有为 OWIN 配置任何其他内容。

有人可以帮我解决这个问题吗?

基本身份验证重定向到登录页面,而不是返回身份验证质询

好的,我找到了解决此问题的方法。第一部分是从第一个样本中抛出map.MapSignalR<AuthenticatedEchoConnection>("/echo"); - 这不是必需的,由于某种原因我没有发现它阻止了 SignalR 正常工作。

第二部分,也是实际问题的解决方法,是,在客户端中,我也在第一个请求中发送凭据,并且不等待质询。因此,401永远不会发生,因此不会重定向到登录页面。这对我来说已经足够了。

因此,解决方法是,在客户端中,不要像这样使用网络凭据:

connection.Credentials = new NetworkCredential(username, password);

相反,请自己添加授权标头,使其已包含在第一个请求中:

string creds = string.format("{0}:{1}", username, password);
string encodedCreds = Convert.ToBase64String(Encoding.Utf8.GetBytes(creds));
connection.Headers.Add("Authorization", "Basic " + encodedCreds);

此外,我发现,对于OWIN,这个问题似乎是一个更普遍的问题,不仅与SignalR甚至基本身份验证一起使用时有关:

http://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/

因此,通过对基本身份验证模块进行一些修改,也应该可以防止这种重定向。我可能会对此进行调查,并在完成后更新这篇文章。