gpt4 book ai didi

C# HttpListener 多种认证方案和Chrome

转载 作者:可可西里 更新时间:2023-11-01 17:24:46 26 4
gpt4 key购买 nike

好吧,这是一个很长的问题,但我认为这是值得的。我们拥有的:

  1. 一个示例虚拟 C# 控制台应用程序,启动自托管的 o​​win ASP.Net WebAPI 服务(Microsoft.AspNet.WebApi.OwinSelfHost NuGet 包):

    class Program
    {
    static void Main(string[] args)
    {
    var url = "http://localhost:8080/";

    Console.WriteLine($"Starting on {url}");
    using (WebApp.Start<Startup>(url))
    {
    Console.WriteLine("Success! Press any key to stop...");
    Console.ReadKey();
    }
    }
    }
  2. OWIN 启动类:

    class Startup
    {
    public void Configuration(IAppBuilder app)
    {
    // enable Windows AND Anonymous authentication
    var listener = app.Properties["System.Net.HttpListener"] as HttpListener;
    listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous |
    AuthenticationSchemes.IntegratedWindowsAuthentication;

    // configure WebAPI
    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    app.UseWebApi(config);
    }
    }
  3. 具有两个公共(public)方法的示例 WebAPI Controller :

    [RoutePrefix("sample"), Authorize]
    public class SampleController : ApiController
    {
    [Route("public"), AllowAnonymous]
    public object GetPublicSample()
    {
    var message = $"Hi there, mr. {User?.Identity?.Name ?? "ANONYMOUS"}";
    return new { sample = 0, message };
    }

    [Route("protected")]
    public object GetProtectedSample()
    {
    var message = $"Hi there, mr. {User?.Identity?.Name ?? "ANONYMOUS"}";
    return new { sample = 42, message };
    }
    }

现在,当我们运行项目并将 chrome 指向 http://localhost:8080/sample/public 时调用此请求:

GET /sample/public HTTP/1.1
Host: localhost:8080

HTTP/1.1 200 OK
Content-Length: 50
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 28 Feb 2018 08:05:56 GMT

{"sample":0,"message":"Hi there, mr. ANONYMOUS"}

但是当我们转到http://localhost:8080/sample/protected我们有这个:

GET /sample/protected HTTP/1.1
Host: localhost:8080

HTTP/1.1 401 Unauthorized
date: Wed, 28 Feb 2018 08:19:01 GMT
www-authenticate: Negotiate,NTLM
server: Microsoft-HTTPAPI/2.0
content-length: 61
content-type: application/json; charset=utf-8

{"Message":"Authorization has been denied for this request."}

除一件事外,这几乎“符合预期”。我希望当我的浏览器收到带有 www-authenticate header 的 401 HTTP 响应时,他将尝试使用指定的身份验证重复相同的请求(如果请求中没有任何其他 Authorization header )。但出于某种原因他没有:(

为了让事情更有趣,我们可以看到 AuthenticationSchemes.IntegratedWindowsAuthentication 实际上是 AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm 当我删除其中一个时,事情开始按预期工作!例如:在我们的 Startup 类中将 IntegratedWindowsAuthentication 替换为 Negotiate 并将您的浏览器转到 http://localhost:8080/sample/protected

GET /sample/protected HTTP/1.1
Host: localhost:8080

HTTP/1.1 200 OK
date: Wed, 28 Feb 2018 08:29:55 GMT
www-authenticate: tOkeN1231351234153=
server: Microsoft-HTTPAPI/2.0
content-length: 59
content-type: application/json; charset=utf-8

{"sample":42,"message":"Hi there, mr. DOMAIN\\username"}

通常,我们的服务器首先响应 401 HTTP 状态并设置 header www-authenticate: Negotiate,然后浏览器使用额外的 Authorization header 重复请求。如果我们用 Ntlm 替换 IntegratedWindowsAuthentication 也是一样。

还有一个例子可以让事情更清楚。如果我们删除 AuthenticationSchemes.Anonymous 并只保留 AuthenticationSchemes.IntegratedWindowsAuthentication 我们会注意到结果中有两件事:

  1. /sample/public 端点不再可用于匿名请求(如预期的那样)
  2. /sample/protected 端点现在正常工作 (!)

如果我们查看第一个 401 服务器响应,我们会注意到有两个 www-authenticate header 而不是一个(和以前一样):

GET /sample/protected HTTP/1.1
Host: localhost:8080

HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Wed, 28 Feb 2018 08:44:04 GMT

所以,我的问题是:将多个身份验证方案放在单个 www-authenticate header 中是否“可以”?如果“是的,没关系”,为什么我的 chrome 不处理这种情况?如果“不!完全错了!”,为什么 HttpListener 会这样,我该如何绕过它?请帮忙!

最佳答案

不久前有人问过这个问题,但我想提供我的 .02。 AuthenticationSchemes.IntegratedWindowsAuthentication 有点奇怪。 IWA 与设置 Negotiate and NTLM 相同。另一方面,如果 Kerberos 失败,协商将回退到 NTLM。 ASP.NET Core 枚举中没有 IWA:See ASP.NET Core AuthenticationSchemes Enum

我使用:

listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous | AuthenticationSchemes.Negotiate;

关于C# HttpListener 多种认证方案和Chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49025580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com