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

1 c# authentication httplistener asp.net-web-api owin

我有一个使用OWIN自托管的Intranet应用程序来提供SPA/WebAPI 2类型的站点.一切都很好,如localhost:port和IP:port,但是IE和Chrome的主机名:端口都失败了.然而,该应用程序适用于FireFox.

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

我的大多数代码都是从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");
 }
Run Code Online (Sandbox Code Playgroud)

这是我的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
    });
}
Run Code Online (Sandbox Code Playgroud)

我还确保使用netsh设置网址预留:

netsh http add urlacl url=http://*:9000/ user=Everyone
Run Code Online (Sandbox Code Playgroud)

IE和Chrome都尝试集成身份验证的Intranet模型,并尝试立即在所有Intranet应用程序中发送凭据.FF始终提示输入凭据,并且永远不会自动进行身份验证.这使我倾向于认证作为问题.

有没有人知道我可以检查什么来验证身份验证方面?提琴手没有很好地阐明这个要求.在请求主机时,应用程序似乎永远不会触及断点.

我认为可能有一个团体/本地政策阻碍了正确的身份验证,但我不确定从哪里开始寻找.

*编辑 - 更新标签

*更新

一些进一步的测试表明,迫使auth到NTLM(相对于集成)允许Chrome自动登录,FF可以像往常一样工作,IE在一个奇怪的地方.

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

我现在有一个解决方法,但如果有人有任何想法,找出kerberos仍然很好.

小智 5

将代码更改为

HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm;
Run Code Online (Sandbox Code Playgroud)

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