基本身份验证重定向到登录页面,而不是返回身份验证质询
本文关键字:身份验证 返回 重定向 登录 | 更新日期: 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/
因此,通过对基本身份验证模块进行一些修改,也应该可以防止这种重定向。我可能会对此进行调查,并在完成后更新这篇文章。