Skip to content

Commit 4515ffa

Browse files
Only call IsSelfSigned() once (#39877)
1 parent fbfb11e commit 4515ffa

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,11 @@ private async Task<CertificateAuthenticationFailedContext> HandleFailureAsync(Ex
118118

119119
private async Task<AuthenticateResult> ValidateCertificateAsync(X509Certificate2 clientCertificate)
120120
{
121+
var isCertificateSelfSigned = clientCertificate.IsSelfSigned();
122+
121123
// If we have a self signed cert, and they're not allowed, exit early and not bother with
122124
// any other validations.
123-
if (clientCertificate.IsSelfSigned() &&
125+
if (isCertificateSelfSigned &&
124126
!Options.AllowedCertificateTypes.HasFlag(CertificateTypes.SelfSigned))
125127
{
126128
Logger.CertificateRejected("Self signed", clientCertificate.Subject);
@@ -129,14 +131,14 @@ private async Task<AuthenticateResult> ValidateCertificateAsync(X509Certificate2
129131

130132
// If we have a chained cert, and they're not allowed, exit early and not bother with
131133
// any other validations.
132-
if (!clientCertificate.IsSelfSigned() &&
134+
if (!isCertificateSelfSigned &&
133135
!Options.AllowedCertificateTypes.HasFlag(CertificateTypes.Chained))
134136
{
135137
Logger.CertificateRejected("Chained", clientCertificate.Subject);
136138
return AuthenticateResult.Fail("Options do not allow chained certificates.");
137139
}
138140

139-
var chainPolicy = BuildChainPolicy(clientCertificate);
141+
var chainPolicy = BuildChainPolicy(clientCertificate, isCertificateSelfSigned);
140142
using var chain = new X509Chain
141143
{
142144
ChainPolicy = chainPolicy
@@ -186,13 +188,13 @@ protected override async Task HandleChallengeAsync(AuthenticationProperties prop
186188
await HandleForbiddenAsync(properties);
187189
}
188190

189-
private X509ChainPolicy BuildChainPolicy(X509Certificate2 certificate)
191+
private X509ChainPolicy BuildChainPolicy(X509Certificate2 certificate, bool isCertificateSelfSigned)
190192
{
191193
// Now build the chain validation options.
192194
X509RevocationFlag revocationFlag = Options.RevocationFlag;
193195
X509RevocationMode revocationMode = Options.RevocationMode;
194196

195-
if (certificate.IsSelfSigned())
197+
if (isCertificateSelfSigned)
196198
{
197199
// Turn off chain validation, because we have a self signed certificate.
198200
revocationFlag = X509RevocationFlag.EntireChain;
@@ -210,7 +212,7 @@ private X509ChainPolicy BuildChainPolicy(X509Certificate2 certificate)
210212
chainPolicy.ApplicationPolicy.Add(ClientCertificateOid);
211213
}
212214

213-
if (certificate.IsSelfSigned())
215+
if (isCertificateSelfSigned)
214216
{
215217
chainPolicy.VerificationFlags |= X509VerificationFlags.AllowUnknownCertificateAuthority;
216218
chainPolicy.VerificationFlags |= X509VerificationFlags.IgnoreEndRevocationUnknown;

0 commit comments

Comments
 (0)