@@ -18,6 +18,7 @@ public abstract class HttpClientHandler_Authentication_Test : HttpClientTestBase
1818 private const string Domain = "testdomain" ;
1919
2020 private static readonly NetworkCredential s_credentials = new NetworkCredential ( Username , Password , Domain ) ;
21+ private static readonly NetworkCredential s_credentialsNoDomain = new NetworkCredential ( Username , Password ) ;
2122
2223 private static readonly Func < HttpClientHandler , Uri , HttpStatusCode , ICredentials , Task > s_createAndValidateRequest = async ( handler , url , expectedStatusCode , credentials ) =>
2324 {
@@ -34,12 +35,17 @@ public abstract class HttpClientHandler_Authentication_Test : HttpClientTestBase
3435 [ MemberData ( nameof ( Authentication_TestData ) ) ]
3536 public async Task HttpClientHandler_Authentication_Succeeds ( string authenticateHeader , bool result )
3637 {
37- if ( PlatformDetection . IsWindowsNanoServer || ( IsCurlHandler && authenticateHeader . ToLowerInvariant ( ) . Contains ( "digest" ) ) )
38+ if ( PlatformDetection . IsWindowsNanoServer )
3839 {
3940 // TODO: #28065: Fix failing authentication test cases on different httpclienthandlers.
4041 return ;
4142 }
4243
44+ // Digest authentication does not work with domain credentials on CurlHandler. This is blocked by the behavior of LibCurl.
45+ NetworkCredential credentials = ( IsCurlHandler && authenticateHeader . ToLowerInvariant ( ) . Contains ( "digest" ) ) ?
46+ s_credentialsNoDomain :
47+ s_credentials ;
48+
4349 var options = new LoopbackServer . Options { Domain = Domain , Username = Username , Password = Password } ;
4450 await LoopbackServer . CreateServerAsync ( async ( server , url ) =>
4551 {
@@ -50,7 +56,7 @@ await LoopbackServer.CreateServerAsync(async (server, url) =>
5056 server . AcceptConnectionSendResponseAndCloseAsync ( HttpStatusCode . Unauthorized , serverAuthenticateHeader ) ;
5157
5258 await TestHelper . WhenAllCompletedOrAnyFailedWithTimeout ( TestHelper . PassingTestTimeoutMilliseconds ,
53- s_createAndValidateRequest ( handler , url , result ? HttpStatusCode . OK : HttpStatusCode . Unauthorized , s_credentials ) , serverTask ) ;
59+ s_createAndValidateRequest ( handler , url , result ? HttpStatusCode . OK : HttpStatusCode . Unauthorized , credentials ) , serverTask ) ;
5460 } , options ) ;
5561 }
5662
@@ -139,21 +145,13 @@ public static IEnumerable<object[]> Authentication_TestData()
139145 yield return new object [ ] { "bAsiC " , true } ;
140146 yield return new object [ ] { "basic" , true } ;
141147
142- // Add digest tests fail on CurlHandler.
143- // TODO: #28065: Fix failing authentication test cases on different httpclienthandlers.
144- yield return new object [ ] { "Digest realm=\" testrealm\" nonce=\" testnonce\" " , false } ;
145148 yield return new object [ ] { $ "Digest realm=\" testrealm\" , nonce=\" { Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( $ "{ DateTimeOffset . UtcNow } :XMh;z+$5|`i6Hx}}\" , qop=auth-int, algorithm=MD5") ) } \" ", true } ;
146- yield return new object [ ] { "Digest realm=\" api@example.org\" , qop=\" auth\" , algorithm=MD5-sess, nonce=\" 5TsQWLVdgBdmrQ0XsxbDODV+57QdFR34I9HAbC/RVvkK\" , " +
147- "opaque=\" HRPCssKJSGjCrkzDg8OhwpzCiGPChXYjwrI2QmXDnsOS\" , charset=UTF-8, userhash=true" , true } ;
148- yield return new object [ ] { "dIgEsT realm=\" api@example.org\" , qop=\" auth\" , algorithm=MD5-sess, nonce=\" 5TsQWLVdgBdmrQ0XsxbDODV+57QdFR34I9HAbC/RVvkK\" , " +
149- "opaque=\" HRPCssKJSGjCrkzDg8OhwpzCiGPChXYjwrI2QmXDnsOS\" , charset=UTF-8, userhash=true" , true } ;
150149 yield return new object [ ] { $ "Basic realm=\" testrealm\" , " +
151150 $ "Digest realm=\" testrealm\" , nonce=\" { Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( $ "{ DateTimeOffset . UtcNow } :XMh;z+$5|`i6Hx}}") ) } \" , algorithm=MD5", true } ;
152151
153152 if ( PlatformDetection . IsNetCore )
154153 {
155154 // TODO: #28060: Fix failing authentication test cases on Framework run.
156- yield return new object [ ] { "Digest realm=\" testrealm1\" , nonce=\" testnonce1\" Digest realm=\" testrealm2\" , nonce=\" testnonce2\" " , false } ;
157155 yield return new object [ ] { "Basic something, Digest something" , false } ;
158156 yield return new object [ ] { $ "Digest realm=\" testrealm\" , nonce=\" testnonce\" , algorithm=MD5 " +
159157 $ "Basic realm=\" testrealm\" ", false } ;
0 commit comments