首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MsalUiRequiredException:未向AcquireTokenSilent调用传递任何帐户或登录提示

MsalUiRequiredException:未向AcquireTokenSilent调用传递任何帐户或登录提示
EN

Stack Overflow用户
提问于 2021-03-12 04:08:41
回答 1查看 650关注 0票数 0

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

代码语言:javascript
复制
 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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-12 15:38:03

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

代码语言:javascript
复制
AuthenticationResult authResult;
try
{
    authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
                                          .ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
    authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
                              .ExecuteAsync();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66589812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档