如何通过 Flurl 库使用 Windows 身份验证?

How do I use Windows Authentication with the Flurl library?

Flurl 具有执行 OAuth 和基本身份验证的方法:

await url.WithBasicAuth("username", "password").GetJsonAsync();
await url.WithOAuthBearerToken("mytoken").GetJsonAsync();

但是如何使用当前登录的用户进行 Windows 身份验证? Flurl 构建于其之上的 HttpClientHandler 有一个 属性 UseDefaultCredentials 但我不知道如何在 Flurl 中使用它。

var httpClient = new HttpClient(new HttpClientHandler() 
{
    UseDefaultCredentials = true
});

Flurl 智能地为每个域重用 HttpClientHandler,因此您不想在每次运行时都设置 UseDefaultCredentials。相反,您可以将 HttpClientFactory 修改为 return 配置为 UseDefaultCredentials 的

public class UseDefaultCredentialsClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new HttpClientHandler { UseDefaultCredentials = true };
    }
} 

然后您需要告诉 Flurl 将此工厂用于您要使用 Windows 身份验证的域。

public static class FlurlConfiguration
{
    public static void ConfigureDomainForDefaultCredentials(string url)
    {
        FlurlHttp.ConfigureClient(url, cli =>
            cli.Settings.HttpClientFactory = new UseDefaultCredentialsClientFactory());
    }
}

然后您只需在每个域的启动时调用一次。对于 ASP.NET,全局应用程序 class 中的 Application_Start 方法是一个很好的地方。

FlurlConfiguration.ConfigureDomainForDefaultCredentials("https://example.com");
FlurlConfiguration.ConfigureDomainForDefaultCredentials("http://services.example.com");

归功于 Todd Menier for explaining this to me

如果它仍然相关。您可以设置凭证,像这样

 ((HttpClientHandler)url.Client.HttpMessageHandler).Credentials = new NetworkCredential(userName, password);