c# - 使用 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 中,它有我的电子邮件、姓名等,让我相信它成功地从令牌中获取了我的信息。
有任何想法吗?
解决方案
我终于弄清楚了这个问题(或者至少让它工作了)。这与观众有关。你说什么是观众?我不能告诉你。但我的不工作,因为它是单租户。我读过的大多数教程都使用了多租户,它的处理方式不同。
这是变化:
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。一旦我添加了它,它就起作用了。
推荐阅读
- java - 在文本视图中设置文本
- reactjs - 使用 React-Router 时是否可以抽象 Link 声明?
- python - 向数据框添加词性列
- blazor-server-side - 是否可能:使用 Blazor 服务器端作为客户端应用程序
- teamcity - TeamCity 的子版本中未更新相关参数
- c# - 从用户的手机获取 GPS 以验证他们在美国
- javascript - 禁用 create-react-app 的 SKIP_PREFLIGHT_CHECK 有缺点吗?
- django-rest-framework - 我们如何处理密码更改和忘记密码以及令牌刷新?
- jenkins - 如何触发另一个需要 $BRANCH 变量的 Jenkins 管道?
- aframe - 大家好,我正在尝试根据 URL 参数动态更改 a-text 值