【问题标题】:Owin WebApi 2 Hostname IntegratedAuth Failing - 400 error and bad credentialsOwin WebApi 2 主机名 IntegratedAuth 失败 - 400 错误和错误凭据
【发布时间】:2015-10-03 16:40:40
【问题描述】:

我有一个使用 OWIN 自托管服务于 SPA/WebAPI 2 类型站点的 Intranet 应用程序。一切都可以作为 localhost:port 和 IP:port 使用,但对于 IE 和 Chrome,hostname:port 会失败。然而,该应用程序可以与 FireFox 一起使用。

我相信这是由于集成的身份验证。 Chrome 返回 ERR_INVALID_AUTH_CREDENTIALS,IE 返回 400 bad request。 Fiddler 在请求/响应的标头中没有显示出太大差异,除了身份验证通过并且我在 FF 中得到 200,在 IE 中得到 400,在 Chrome 中得到 401。

我的大部分代码都是从 SO 文章或 MSDN 教程中“借来的”。这是我的 Program.cs:

string baseAddress = "http://*:9000/";
using (WebApp.Start<Startup>(new StartOptions(baseAddress) { ServerFactory =  "Microsoft.Owin.Host.HttpListener" }))
{
    // Keep server operational till stopped
    Console.WriteLine("Started, Press any key to stop.");
    Console.ReadKey();
    Console.WriteLine("Stopped");
 }

这是我的 startup.cs:

public void Configuration(IAppBuilder appBuilder)
{
    var listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
    listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;

    // Configure Web API for self-host. 
    HttpConfiguration config = new HttpConfiguration();

    WebApiConfig.Register(config);
    appBuilder.UseWebApi(config);
    appBuilder.UseFileServer(new FileServerOptions
    {
        RequestPath = new PathString(string.Empty),
        //  path to static files.
        FileSystem = new PhysicalFileSystem("./public"),
        EnableDirectoryBrowsing = false
    });
}

我还确保使用 netsh 设置 url 保留:

netsh http add urlacl url=http://*:9000/ user=Everyone

IE 和 Chrome 都尝试了集成身份验证的 Intranet 模型,并尝试在我们所有的 Intranet 应用程序中立即发送凭据。 FF 总是提示输入凭据并且从不自动验证。这让我倾向于将身份验证作为问题。

有没有人知道我可以检查什么来验证事物的身份验证方面? Fiddler 没有很好地说明请求。向主机发出请求时,似乎从未在应用程序中触及断点。

我认为可能存在妨碍正确身份验证的组/本地策略,但我不确定从哪里开始查找。

*编辑 - 更新标签

*更新

一些进一步的测试表明,强制对 NTLM 进行身份验证(相对于集成)允许 Chrome 自动登录,FF 可以像往常一样工作,并且 IE 处于一个奇怪的位置。

IE 将自动登录,但无法在页面上加载 JS,或者提示用户,然后根据 FQDN 与短名称正确登录。我相信这是由于默认的 IE 行为和受信任/Intranet 站点设置。

我现在有一个解决方法,但如果有人有任何想法,弄清楚 kerberos 仍然会很好。

【问题讨论】:

  • 我查看了 fiddler 的 auth 部分,发现当连接失败时,浏览器正在尝试通过 kerberos 进行连接。但是成功的连接发生在 NTLM 上。将 AuthenticationScheme 强制为 NTLM,让我更接近,但仍然不开心。我正在通过初始身份验证,但随后无法通过我在 WebApi 中的授权。当我得到更多细节时,我会回复。
  • 一些进一步的测试表明,强制 NTLM 允许 Chrome 自动登录,FF 可以像往常一样工作,并且 IE 在一个奇怪的地方。

标签: c# authentication asp.net-web-api owin httplistener


【解决方案1】:

把代码改成

HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm;

在 Self Host Web API 中,它解决了这个问题。

【讨论】:

  • 这就是我所做的并且它有效。它让我有点发疯,不完全理解为什么带有 kerberos 的集成身份验证在本地工作而不是远程工作。但我可以忍受它......
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2019-11-30
  • 2019-04-28
相关资源
最近更新 更多