我有一个客户应用程序,我想研究一下天蓝色广告令牌声明。通过客户端应用程序,我说的是在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,如果为true,则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服务器才能做到这一点?
答案 0 :(得分: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应用进行设置的演练: