我有一个.NET Core Web应用程序和Web Api,我正在从IOS应用程序(使用Xamarin.ios)中调用。该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中,有我的电子邮件,姓名等信息 让我相信它成功地从令牌中获取了我的信息。
有什么办法吗?
我终于弄明白了这个问题(或至少让它工作了)。这与Audience有关。你说,观众是什么?我不能告诉你。但我的没有工作,因为它是单租户。我看的大部分教程都是用多租户,处理方式不同。
这就是变化。
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。我加了这个之后,就成功了。