首页 > 解决方案 > 使用 MSAL 从 Xamarin.ios 授权时出现 SecurityTokenInvalidSignatureException

问题描述

我有一个从 IOS 应用程序(使用 Xamarin.ios)调用的 .NET Core Web 应用程序和 Web Api。Web 应用程序托管在专用服务器上的 IIS 中。我正在使用 MSAL 单租户进行身份验证。这部分似乎工作正常,因为我可以登录并获取访问令牌。

浏览器工作正常,我可以导航到 WebApi 没问题。但是,当我尝试向我的 Api 发出 http 请求时,我的应用程序中出现 401。这是电话:

string accessToken = await SecureStorage.GetAsync("AccessToken");
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//_httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);

HttpResponseMessage response = await _httpClient.GetAsync($"api/{uriSuffix}");
response.EnsureSuccessStatusCode();
string reply = await response.Content.ReadAsStringAsync();
return reply;

调试服务器,我得到:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: 'IDX10511: Signature validation failed. 

在异常的 PII 中,它有我的电子邮件、姓名等,让我相信它成功地从令牌中获取了我的信息。

有任何想法吗?

标签: c#asp.net-corexamarin.iosazure-active-directorymsal

解决方案


我终于弄清楚了这个问题(或者至少让它工作了)。这与观众有关。你说什么是观众?我不能告诉你。但我的不工作,因为它是单租户。我读过的大多数教程都使用了多租户,它的处理方式不同。

这是变化:

  private IPublicClientApplication _pca;
        readonly string[] Scopes = 
        {
            "<tenant_id>/<api_permission>"
        };

        public AuthenticationHelper()
        {
            _pca = PublicClientApplicationBuilder.Create(<tenant_id>)
                .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
                .WithRedirectUri("msauth.<bundle_id>://auth")
                .WithAuthority("https://login.microsoftonline.com/<client_id>/v2.0")
                .Build();
        }

重要的一点是“Scopes”变量。请注意,我在 api 权限前加上“tenant_id\”,其中tenant_id 是我的租户的 guid。一旦我添加了它,它就起作用了。


推荐阅读