Skip to main content
 首页 » 编程设计

c#之Owin WebApi 2 主机名 IntegratedAuth 失败之400 错误和错误凭证

2024年01月31日33daizhj

我有一个内部网应用程序使用 OWIN 自托管服务于 SPA/WebAPI 2 类型的站点。 localhost:port 和 IP:port 一切正常,但 hostname:port 对 IE 和 Chrome 失败。然而,该应用程序适用于 FireFox。

我相信这是由于集成身份验证。 Chrome 返回 ERR_INVALID_AUTH_CREDENTIALS,IE 返回 400 错误请求。 Fiddler 在请求/响应的 header 中没有显示出太大差异,除了身份验证通过并且我在 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 行为和受信任/内部网站设置所致。

我现在有一个变通办法,但如果有人有任何想法,弄清楚 kerberos 仍然很好。

请您参考如下方法:

将代码改为

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

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