1// Copyright (c) Microsoft Corporation. All rights reserved.2// Licensed under the MIT License.34using System;5using System.Collections.Generic;6using System.Security;7using System.Threading;8using System.Threading.Tasks;9using Azure.Core.Pipeline;10using Microsoft.Identity.Client;11using Microsoft.Identity.Client.Extensions.Msal;1213namespace Azure.Identity14{15 internal class MsalPublicClient : MsalClientBase<IPublicClientApplication>16 {17 private readonly string _redirectUrl;1819 protected MsalPublicClient()20 {21 }2223 public MsalPublicClient(CredentialPipeline pipeline, string tenantId, string clientId, string redirectUrl, IToke24 : base(pipeline, tenantId, clientId, cacheOptions)25 {26 _redirectUrl = redirectUrl;27 }2829 protected override Task<IPublicClientApplication> CreateClientAsync()30 {31 var authorityHost = Pipeline.AuthorityHost;3233 var authorityUri = new UriBuilder(authorityHost.Scheme, authorityHost.Host, authorityHost.Port, TenantId ?? 3435 PublicClientApplicationBuilder pubAppBuilder = PublicClientApplicationBuilder.Create(ClientId).WithAuthority3637 if (!string.IsNullOrEmpty(_redirectUrl))38 {39 pubAppBuilder = pubAppBuilder.WithRedirectUri(_redirectUrl);40 }4142 return Task.FromResult(pubAppBuilder.Build());43 }4445 public virtual async Task<IEnumerable<IAccount>> GetAccountsAsync()46 {47 await EnsureInitializedAsync(true).ConfigureAwait(false);4849 return await Client.GetAccountsAsync().ConfigureAwait(false);50 }5152 public virtual async Task<AuthenticationResult> AcquireTokenSilentAsync(string[] scopes, IAccount account, bool 53 {54 await EnsureInitializedAsync(async).ConfigureAwait(false);5556 return await Client.AcquireTokenSilent(scopes, account).ExecuteAsync(async, cancellationToken).ConfigureAwai57 }5859 public virtual async Task<AuthenticationResult> AcquireTokenInteractiveAsync(string[] scopes, Prompt prompt, boo60 {61 await EnsureInitializedAsync(async).ConfigureAwait(false);6263 return await Client.AcquireTokenInteractive(scopes).WithPrompt(prompt).ExecuteAsync(async, cancellationToken64 }6566 public virtual async Task<AuthenticationResult> AcquireTokenByUsernamePasswordAsync(string[] scopes, string user67 {68 await EnsureInitializedAsync(async).ConfigureAwait(false);6970 return await Client.AcquireTokenByUsernamePassword(scopes, username, password).ExecuteAsync(async, cancellat71 }7273 public virtual async Task<AuthenticationResult> AcquireTokenWithDeviceCodeAsync(string[] scopes, Func<DeviceCode74 {75 await EnsureInitializedAsync(async).ConfigureAwait(false);7677 return await Client.AcquireTokenWithDeviceCode(scopes, deviceCodeCallback).ExecuteAsync(async, cancellationT78 }7980 public virtual async Task<AuthenticationResult> AcquireTokenByRefreshToken(string[] scopes, string refreshToken,81 {82 await EnsureInitializedAsync(async).ConfigureAwait(false);8384 return await ((IByRefreshToken)Client).AcquireTokenByRefreshToken(scopes, refreshToken).WithAuthority(azureC85 }86 }87}ncG1vNJzZmiZqqq%2Fpr%2FDpJirrJmbrqTA0meZpaeSY7CwvsRnrqKmlKTEtHrNnqtomaqqv6Z50p2iZp6fp3qvsdNoeqiclVp%2FcY%2FOr5yrmZeafILG1KucZ4GUmru1tdOyloarkaGdtq7Lopp8pJmau7V6x62kpQ%3D%3D