【问题标题】:MSAL error "parsing_wstrust_response_failed" when trying to use AcquireTokenByIntegratedWindowsAuth尝试使用 AcquireTokenByIntegratedWindowsAuth 时出现 MSAL 错误“parsing_wstrust_response_failed”
【发布时间】: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; } }
    }

【问题讨论】:

    标签: azure adal


    【解决方案1】:

    基于https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Integrated-Windows-AuthenticationAcquireTokenByIntegratedWindowsAuth 方法存在许多约束。

    如果您使用自己的用户帐户进行测试,则必须同意您帐户的应用程序。此外,使用此身份验证流程时无法启用 2FA。

    对于其他用户,他们需要同意应用程序访问其帐户详细信息,或者租户管理员必须使用门户中的 Grant admin consent for Tenant 按钮在整个租户中授予同意。

    此流程仅适用于“联合用户”(例如,在 AD 而不是 AzureAD 中创建)。

    此流程主要针对桌面应用程序。它仅适用于 .net 桌面、.net 核心和 Windows 通用应用程序。

    【讨论】:

    • 您仍然可以在应用程序端以有意义的方式处理此异常并将其显示给最终用户或将其用于故障排除目的。如下所示,try { } catch (MsalClientException ex) when (ex.ErrorCode == "parsing_wstrust_response_failed") { // 对于联合用户(由联合 IdP 拥有,而不是在Azure AD 租户)。无法对安全令牌进行身份验证或授权。用户不存在或输入了错误的密码}
    猜你喜欢
    • 2020-06-24
    • 2014-02-05
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多