8.3响应 Cookie 与身份验证

在 HTTP 请求中,如果服务器设置了 Cookie,响应头中会包含一个或多个 Set-Cookie 键值对。客户端接收到响应后,可以通过读取这些 Set-Cookie 键值对来获取 Cookie 信息。框架提供了以下两种便捷的方式来获取 Cookie:

HTTP 请求中,如果服务器设置了 Cookie,响应头中会包含一个或多个 Set-Cookie 键值对。客户端接收到响应后,可以通过读取这些 Set-Cookie 键值对来获取 Cookie 信息。框架提供了以下两种便捷的方式来获取 Cookie

1. 使用 HttpRemoteResult<TResult> 返回值类型

HttpRemoteResult<TResult> 是一个泛型类型,专门用于封装 HTTP 远程请求模块中的响应内容。该类型不仅包含了常用的 HTTP 响应信息,还提供了请求耗时等功能。

cs
// 使用请求谓词方式(result 类型为 HttpRemoteResult<string>)var result = await httpRemoteService.GetAsync<string>("https://furion.net/");var setCookies = result.SetCookies; // 获取响应中的 Cookie 集合(IList<SetCookieHeaderValue> 类型)var rawSetCookies = result.RawSetCookies; // 获取原始响应头中的 Set-Cookie 集合(List<string> 类型)// 使用构建器方式同样适用(result 类型为 HttpRemoteResult<string>)var result = await httpRemoteService.SendAsync<string>(HttpRequestBuilder.Get("https://furion.net/"));

2. 使用 HttpResponseMessageTryGetSetCookies 扩展方法

框架还为 HttpResponseMessageHttpResponseHeaders 类型提供了 TryGetSetCookies 扩展方法,可以方便地读取并解析 Set-Cookie 响应头信息。

cs
var httpResponseMessage = await httpRemoteService.GetAsync("https://furion.net/");httpResponseMessage.TryGetSetCookies(out var setCookies, out var rawSetCookies);// 或者通过 Headers 属性获取// httpResponseMessage.Headers.TryGetSetCookies(out var setCookies, out var rawSetCookies);

通过以上两种方式,开发者可以轻松获取并处理 HTTP 响应中的 Cookie 信息。

配置 Windows 身份验证#

Windows 身份验证是微软提供的一种安全机制,用于验证用户或实体的身份,确保他们对系统、网络资源和应用程序的访问符合安全策略。该机制通常用于 Windows 操作系统,允许用户无需手动输入用户名和密码即可登录系统或依赖该机制的应用程序。

在某些传统的基于 Windows 服务器部署的 Web 应用系统中,发送 HTTP 远程请求可能需要启用 Windows 身份验证。以下是两种常见的配置方式:

1. 使用当前 Windows 系统登录的用户(推荐)#

cs
// 配置默认客户端services.AddHttpClient(string.Empty)    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler    // 或使用 SocketsHttpHandler    {        UseDefaultCredentials = true    });// 配置特定客户端services.AddHttpClient("furion")    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler    // 或使用 SocketsHttpHandler    {        UseDefaultCredentials = true    });

2. 手动输入 Windows 系统用户名和密码#

cs
// 配置默认客户端services.AddHttpClient(string.Empty)    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler    // 或使用 SocketsHttpHandler    {        Credentials = new NetworkCredential("windows登录用户名", "windows登录密码"),        PreAuthenticate = true    });// 配置特定客户端services.AddHttpClient("furion")    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler    // 或使用 SocketsHttpHandler    {        Credentials = new NetworkCredential("windows登录用户名", "windows登录密码"),        PreAuthenticate = true    });

通过以上配置,您可以根据需求选择使用当前系统用户或手动输入凭据来启用 Windows 身份验证。

配置 KerberosActive Directory 身份验证#

Kerberos 是一种网络认证协议,它利用对称密钥加密技术来验证用户和服务的身份。通过使用票证(tickets)机制,Kerberos 能够确保在网络上的通信是安全的,并且可以有效地防止窃听、重放攻击等安全威胁。自 Windows 2000 开始,Kerberos 成为了域环境下的默认认证协议。

Active Directory (AD) 是微软提供的一系列目录管理服务,用于 Windows 域网络的管理和安全设置。它允许 IT 管理员管理网络中的用户、设备和其他资源,并提供了诸如身份验证、授权等功能。AD 支持多种认证协议,包括 NTLMNT LAN Manager),但更推荐使用 Kerberos 因为其更高的安全性。


如果您的应用程序运行在域环境中,并且目标服务支持 Windows 身份验证(如 NegotiateNTLM),可以直接使用 Windows 身份验证的配置方法。以下是具体配置示例:

1. 使用当前域用户的凭据(推荐)#

此方式适用于应用程序与目标服务在同一个域环境中运行的情况。系统会自动使用当前域用户的凭据进行身份验证。

cs
// 配置默认客户端services.AddHttpClient(string.Empty)    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler    // 或使用 SocketsHttpHandler    {        UseDefaultCredentials = true    });// 配置特定客户端services.AddHttpClient("furion")    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler    // 或使用 SocketsHttpHandler    {        UseDefaultCredentials = true    });

2. 跨域环境的 Kerberos 身份验证#

如果应用程序与目标服务不在同一个域环境中,可以通过安装 Microsoft.Identity.Client 库来实现跨域身份验证。该库提供了对 Kerberos 和其他身份验证协议的支持。

安装 NuGet 包#

bash
dotnet add package Microsoft.Identity.Client

使用 Microsoft.Identity.Client 实现身份验证#

以下是一个简单的示例,展示如何使用 Microsoft.Identity.Client 获取访问令牌并进行身份验证:

cs
using Microsoft.Identity.Client;// 配置身份验证参数var clientId = "你的客户端ID";var tenantId = "你的租户ID";var authority = $"https://login.microsoftonline.com/{tenantId}";var app = PublicClientApplicationBuilder.Create(clientId)    .WithAuthority(authority)    .Build();// 获取访问令牌var scopes = new[] { "api://目标服务的作用域" };var result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();// 使用访问令牌调用目标服务httpRemoteService.SendAsync(HttpRequestBuilder.Post("https://furion.net/")    .AddBearerAuthentication(result.AccessToken));

3. 参考文档#

通过以上配置,您可以根据应用程序的运行环境选择合适的身份验证方式,确保安全访问目标服务。