Secured Asp.net Core2.2 WebAPI with Azure AD Authentication is not working on IIS but working fine on IIS Express using Visual Studio

119 Views Asked by At

I created web API using .NET Core 2.2 and authenticate with Azure AD using username and password with:

await app.AcquireTokenByUsernamePassword(scopes, userName, Password).ExecuteAsync();

Using Visual Studio web API authentication code is working fine But When the same API is deployed on IIS we get the below exception for:

await app.AcquireTokenByUsernamePassword(scopes, userName, Password).ExecuteAsync();

authentication method.

InnerException:

The operation was canceled.

Stack Exception: at System.Net.Http.HttpClient.HandleFinishSendAsyncError(Exception e, CancellationTokenSource cts)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Microsoft.Identity.Client.Http.HttpManager.ExecuteAsync(Uri endpoint, IDictionary`2 headers, HttpContent body, HttpMethod method, ILoggerAdapter logger, CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Http.HttpManager.ExecuteWithRetryAsync(Uri endpoint, IDictionary`2 headers, HttpContent body, HttpMethod method, ILoggerAdapter logger, Boolean doNotThrow, Boolean retry, CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Http.HttpManager.SendGetAsync(Uri endpoint, IDictionary`2 headers, ILoggerAdapter logger, Boolean retry, CancellationToken cancellationToken)
   at Microsoft.Identity.Client.OAuth2.OAuth2Client.ExecuteRequestAsync[T](Uri endPoint, HttpMethod method, RequestContext requestContext, Boolean expectErrorsOn200OK, Boolean addCommonHeaders, Func`2 onBeforePostRequestData)
   at Microsoft.Identity.Client.OAuth2.OAuth2Client.DiscoverAadInstanceAsync(Uri endPoint, RequestContext requestContext)
   at Microsoft.Identity.Client.Instance.Discovery.NetworkMetadataProvider.SendInstanceDiscoveryRequestAsync(Uri authority, RequestContext requestContext)
   at Microsoft.Identity.Client.Instance.Discovery.NetworkMetadataProvider.FetchAllDiscoveryMetadataAsync(Uri authority, RequestContext requestContext)
   at Microsoft.Identity.Client.Instance.Discovery.NetworkMetadataProvider.GetMetadataAsync(Uri authority, RequestContext requestContext)
   at Microsoft.Identity.Client.Instance.Discovery.InstanceDiscoveryManager.FetchNetworkMetadataOrFallbackAsync(RequestContext requestContext, Uri authorityUri)
   at Microsoft.Identity.Client.Instance.Discovery.InstanceDiscoveryManager.GetMetadataEntryAsync(AuthorityInfo authorityInfo, RequestContext requestContext, Boolean forceValidation)
   at Microsoft.Identity.Client.Instance.AuthorityManager.RunInstanceDiscoveryAndValidationAsync()
   at Microsoft.Identity.Client.Internal.Requests.UsernamePasswordRequest.ExecuteAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.Requests.RequestBase.RunAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.ApiConfig.Executors.PublicClientExecutor.ExecuteAsync(AcquireTokenCommonParameters commonParameters, AcquireTokenByUsernamePasswordParameters usernamePasswordParameters, CancellationToken cancellationToken)

Authrntication Code:

string clientId = "XXXXXXXXXXXXX";
string tenanat = "XXXXXXXXXXXXXXXXXXXX";
string authority = "https://login.microsoftonline.com/" + tenanat;
string[] scopes = new string[] { "user.read" };
IPublicClientApplication app;
app = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority(authority)
    .Build();
var securePassword = new SecureString();
foreach (char c in Password.ToCharArray())
    securePassword.AppendChar(c);

var result = await app.AcquireTokenByUsernamePassword(scopes, userName, Password)ExecuteAsync();
return result.IdToken;
string clientId = "XXXXXXXXXXXXX";
string tenanat = "XXXXXXXXXXXXXXXXXXXX";

string authority = "https://login.microsoftonline.com/" + tenanat;
string[] scopes = new string[] { "user.read" };

IPublicClientApplication app;
app = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority(authority)
    .Build();
var securePassword = new SecureString();
foreach (char c in Password.ToCharArray())
    securePassword.AppendChar(c);

var result = await app.AcquireTokenByUsernamePassword(scopes, userName, Password).ExecuteAsync();
return result.IdToken;
0

There are 0 best solutions below