Owin WebApi 2主机名IntegratedAuth失败- 400错误和坏凭据

本文关键字:错误 失败 WebApi 主机 IntegratedAuth Owin | 更新日期: 2023-09-27 18:02:37

我有一个使用OWIN自托管服务SPA/WebAPI 2类型站点的内部网应用程序。一切工作良好的localhost:port,和IP:port,但主机名:port失败的IE和Chrome。然而,该应用程序可以与FireFox兼容。

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

我的大部分代码都是从SO文章或MSDN教程中"借来的"。这是我的程序。

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没有很好地说明这个请求。当向主机请求时,断点似乎永远不会在应用程序中被触及。

我认为可能有一个组/本地策略妨碍了正确的身份验证,但我不确定从哪里开始寻找。

*edit -更新标签

*更新

一些进一步的测试表明,强制授权到NTLM(而不是集成)允许Chrome自动登录,FF像往常一样工作,IE在一个奇怪的地方。

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

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

Owin WebApi 2主机名IntegratedAuth失败- 400错误和坏凭据

将代码改为

HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm;
在Self Host Web API中,它解决了这个问题。