【发布时间】:2020-05-22 15:06:46
【问题描述】:
我正在尝试从 AD 或 Azure AD 获取令牌,但我对 AcquireTokenByIntegratedWindowsAuth 的调用导致:
MSAL.Desktop.4.14.0.0.MsalClientException: 错误代码:parsing_wstrust_response_failed Microsoft.Identity.Client.MsalClientException:发送请求时出错。 ---> System.Net.Http.HttpRequestException: 发送请求时出错。 ---> System.Net.WebException:远程服务器返回错误:(401)未经授权。 ---> System.ComponentModel.Win32Exception:系统无法联系域控制器来服务身份验证请求。请稍后再试
根据在 Azure 中注册我的应用程序的团队,我是公共客户,我有权使用“user.read”
知道会发生什么,以便我可以与我们公司的 Azure 团队进行交流。这可能是我的错,他们的错或 MS 的错,我只想知道该向谁投诉。大多数代码是由 Azure 门户生成的,我只是将对 AcquireTokenInteractive 的调用更改为 AcquireTokenByIntegratedWindowsAuth,因为我的最终目标是始终以静默方式获取令牌。
public partial class MainWindow : Window
{
string graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";
string[] scopes = new string[] { "user.read" };
public MainWindow()
{
InitializeComponent();
}
private async void CallGraphButton_Click(object sender, RoutedEventArgs e)
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
AuthenticationResult authResult = null;
var app = App.PublicClientApp;
ResultText.Text = string.Empty;
TokenInfoText.Text = string.Empty;
var accounts = await app.GetAccountsAsync();
var firstAccount = accounts.FirstOrDefault();
try
{
authResult = await app.AcquireTokenSilent(scopes, firstAccount)
.ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
try
{
authResult = await app.AcquireTokenByIntegratedWindowsAuth(scopes)
.ExecuteAsync(CancellationToken.None);
}
catch (MsalException msalex)
{
ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
}
}
public partial class App : Application
{
static App()
{
_clientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority($"{Instance}{Tenant}")
.WithDefaultRedirectUri()
.Build();
TokenCacheHelper.EnableSerialization(_clientApp.UserTokenCache);
}
private static string ClientId = "<My Client ID>";
private static string Tenant = "<Our Tenant ID>";
private static string Instance = "https://login.microsoftonline.com/";
private static IPublicClientApplication _clientApp ;
public static IPublicClientApplication PublicClientApp { get { return _clientApp; } }
}
【问题讨论】: