ClientCertificate 属性不再对 HttpSys 触发重新协商
HttpContext.Connection.ClientCertificate
属性不再对 HttpSys 触发 TLS 重新协商。
引入的版本
ASP.NET Core 6.0
旧行为
设置 HttpSysOptions.ClientCertificateMethod = ClientCertificateMethod.AllowRenegotiation
允许通过 HttpContext.Connection.ClientCertificate
和 HttpContext.Connection.GetClientCertificateAsync
触发重新协商。
新行为
设置 HttpSysOptions.ClientCertificateMethod = ClientCertificateMethod.AllowRenegotiation
允许仅通过 HttpContext.Connection.GetClientCertificateAsync
触发重新协商。 HttpContext.Connection.ClientCertificate
返回当前证书(如果有),但不与客户端进行重新协商来请求证书。
更改原因
实现 Kestrel 的相同功能时,很明显应用程序需要能够在触发重新协商之前检查客户端证书的状态。 对于请求正文与重新协商相冲突等问题,检查状态可实现以下使用模式来处理问题:
if (connection.ClientCertificate == null)
{
await BufferRequestBodyAsync();
await connection.GetClientCertificateAsync();
}
建议的操作
使用延迟客户端证书协商的应用应调用 GetClientCertificateAsync(CancellationToken) 来触发重新协商。
受影响的 API
- Microsoft.AspNetCore.Server.HttpSys.HttpSysOptions.ClientCertificateMethod
- Microsoft.AspNetCore.Http.ConnectionInfo.ClientCertificate
- Microsoft.AspNetCore.Http.ConnectionInfo.GetClientCertificateAsync(CancellationToken)