1

我有一个客户端应用程序,我想检查 azure 广告令牌声明。通过客户端应用程序,我指的是在 Windows 10 桌面上运行的可执行文件或在用户上下文中运行的 UWP 应用程序。

我努力了:

var authenticationContext =
    new AuthenticationContext("https://login.microsoftonline.com/common");

var userCredential = new UserCredential();

var result = await authenticationContext
    .AcquireTokenAsync("https://graph.microsoft.com/.default",
        "https://mytenant.onmicrosoft.com/myguid",
        userCredential);

这失败了password_required_for_managed_user

可用文档声称此方法使用 Kerberos,如果属实,Azure ADd 不支持 Kerberos,因此会失败。

var _publicClientApp = new PublicClientApplication(clientId);
var user = new ApplicationUser {
    DisplayableId = upn,
    Identifier = Guid.NewGuid().ToString()
    // other fields can be null
};

var authenticationResult =
    await _publicClientApp.AcquireTokenSilentAsync(_scopes, user);

抛出MsalUiRequiredException (no token in cache)

这不再使用 ADAL,它使用不同的实现AcquireTokenSilentAsync

var authContext =
    new AuthenticationContext("https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
        Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache.DefaultShared);

var result =
    await authContext.AcquireTokenSilentAsync("https://graph.microsoft.com/.default", upn);

这返回相同的MsalUiRequiredException

我很茫然。对于 Web 应用程序,浏览器缓存中会有一个 cookie,我可以使用标准运行时执行静默 SSO。

我是否必须在我的应用程序中嵌入一个 Web 服务器才能做到这一点?

4

1 回答 1

0

AcquireTokenSilentAsync使用现有的refresh_token来获取更新的access_token. 由于您尚未获得令牌,因此它失败了(因此出现“缓存中没有令牌”错误)。

您需要提供后备来处理没有有效refresh_token可用的情况:

AuthenticationResult authResult = null;
string[] scopes = new string[] { "user.read", "mail.read" };
try 
{
    authResult = await App
        .PublicClientApp
        .AcquireTokenSilentAsync(
            scopes, 
            App.PublicClientApp.Users.FirstOrDefault());
} 
catch (MsalUiRequiredException ex) 
{
    // MSAL couldn't get the token silently, so go through the interactive process
    authResult = await App
        .PublicClientApp
        .AcquireTokenAsync(scopes);
}

还有一些针对经典应用和 UWP 应用进行设置的演练:

于 2018-06-21T17:32:57.373 回答