如何在Flurl库中使用Windows身份验证?

12

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
});
3个回答

18

Flurl智能地重用HttpClientHandler,所以你不需要每次运行都设置UseDefaultCredentials。相反,你可以修改HttpClientFactory以返回一个配置为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,在全局应用程序类中的Application_Start方法是一个不错的选择。

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

感谢Todd Menier向我解释此事


1
创建一个带有你的凭据的 HttpClientHandler,并将其传递给 HttpClient,然后传递给 FlurlClient,像这样:
var clientHandler = new HttpClientHandler
{
    Credentials = new NetworkCredential("admin", 
"bm8gcGFzc3dvcmQgaGVyZSB5b3UgZnVja2VyIQ==")
};
var httpClient = new HttpClient(clientHandler);
var client = new FlurlClient(httpClient);
var resp = await url.WithClient(client).GetAsync();

如果您在 HttpClientHandler 中添加 "useDefaultCredentials:",那么这就是正确的答案。 - Ryan Mann

0
如果有需要的话,你可以设置凭据,就像这样。
 ((HttpClientHandler)url.Client.HttpMessageHandler).Credentials = new NetworkCredential(userName, password);

那是浪费的。而且由于该处理程序在多个线程中被重复使用,如果您尝试在其他线程上使用不同的凭据,您可能会遇到线程问题。 - mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接