MsalUiRequiredException:没有向AcquireTokenSilent调用传递帐户或登录提示.<



我正在使用图形API开发Windows窗体应用程序。我创建了一个返回GraphServiceClient的函数和一个返回登录用户的函数。当我启动应用程序时,出现了一个错误- MsalUiRequiredException:没有将帐户或登录提示传递给AcquireTokenSilent调用。下面是代码:

public class GraphHelper
{
private static string ClientId = "clientID";
private static string Tenant = "tenantID";
public static IPublicClientApplication PublicClientApp;
private static string[] scopes = { "user.read" };
private static GraphServiceClient graphClient;
public static async Task<string> GetAccessToken()
{
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithAuthority(AzureCloudInstance.AzurePublic, Tenant)
.Build();
IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
IAccount firstAccount = accounts.FirstOrDefault();
var authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
.ExecuteAsync();
authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
.ExecuteAsync();
return authResult.AccessToken;
}
public static async Task<GraphServiceClient> GetGraphServiceClient()
{
var delegateAuthProvider = new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", GetAccessToken().Result);
return Task.FromResult(0);
});
var graphClient = new GraphServiceClient(delegateAuthProvider);
return graphClient;
}
public  async Task<User> GetMeAsync()
{
graphClient = GetGraphServiceClient().Result;
var user = await graphClient.Me
.Request()
.GetAsync();
return user;
}
}

GetAccountsAsync返回应用程序的用户令牌缓存中的所有可用帐户。当您第一次调用GetAccountsAsync或者令牌缓存为空时,它可以返回空帐户集合。在这种情况下,AcquireTokenSilent将抛出异常。在AcquireTokenSilent周围添加try catch块,如果引发了一个期望,则调用AcquireTokenInteractive

AuthenticationResult authResult;
try
{
authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
.ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}

最新更新