Swagger UI 将 return API 数据,但我的授权调用 return "permission denied"
Swagger UI will return API data, but my Authorized calls return "permission denied"
所以我相信我的 API 服务应该没问题,因为我可以通过 Swagger return 结果?我是从一个 WPF 项目打电话来的。我启动程序,它要求我登录,然后它继续并告诉我我没有权限。
我对网络超级陌生API2,我想我可能只是错误地构建了我的调用。看起来我确实从我的站点正确地取回了一个令牌,唯一的问题是当我尝试实际调用 API 获取数据时。
这是我的代码:
public static string clientId = "{#Calling App Id}";
public static string commonAuthority = "https://login.windows.net/{#my Azure AD tenant}";
public static Uri returnUri = new Uri("http://MyDirectorySearcherApp");
const string ResourceUri = "https://{#Api App Service}.azurewebsites.net";
public static async Task<List<User>> LoadBands(IPlatformParameters parent)
{
AuthenticationResult authResult = null;
List<User> results = new List<User>();
try {
//get token or use refresh
AuthenticationContext authContext = new AuthenticationContext(commonAuthority);
if (authContext.TokenCache.ReadItems().Count() > 0)
authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
authResult = await authContext.AcquireTokenAsync(ResourceUri, clientId, returnUri, parent);
} catch (Exception ee) {
throw ex;
}
using (var httpClient = new HttpClient()) {
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, $"{ResourceUri}/api/Band/")) {
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
using (var response = await httpClient.SendAsync(request)) {
string responseData = await response.Content.ReadAsStringAsync();
//responseData always equals "You do not have permission to view this directory or page"
return results;
}
}
}
编辑: 可能有助于注意我正在使用由 Rest API 调用的 DataAPI,其余 API 由 Azure AD 保护。
编辑: 我正在从便携式 Class 图书馆打电话。
编辑: 好吧,我正在通过身份验证,但这似乎没有任何区别。如果我完全删除 Auth header 我会得到相同的结果
似乎令牌对于受 Azure AD 保护的 Web API 不正确。请检查令牌中的 aud
声明,该声明应与您在 Web API 项目中配置的 Audience
匹配。您可以通过解析此 site.
中的令牌来检查 aud
声明
如果问题仍然存在,请分享您如何保护网络的代码 API。
更新
如果您正在使用如下所示的 Express 模式,您需要使用与网络关联的应用程序 API 获取 access_token。
如果您使用的是 Advanced 模式,我们还应该使用该应用程序来获取令牌,并且 ResourceUri 应该与您在 ALLOWED 中配置的值相匹配代币观众 如下所示:
所以我相信我的 API 服务应该没问题,因为我可以通过 Swagger return 结果?我是从一个 WPF 项目打电话来的。我启动程序,它要求我登录,然后它继续并告诉我我没有权限。
我对网络超级陌生API2,我想我可能只是错误地构建了我的调用。看起来我确实从我的站点正确地取回了一个令牌,唯一的问题是当我尝试实际调用 API 获取数据时。
这是我的代码:
public static string clientId = "{#Calling App Id}";
public static string commonAuthority = "https://login.windows.net/{#my Azure AD tenant}";
public static Uri returnUri = new Uri("http://MyDirectorySearcherApp");
const string ResourceUri = "https://{#Api App Service}.azurewebsites.net";
public static async Task<List<User>> LoadBands(IPlatformParameters parent)
{
AuthenticationResult authResult = null;
List<User> results = new List<User>();
try {
//get token or use refresh
AuthenticationContext authContext = new AuthenticationContext(commonAuthority);
if (authContext.TokenCache.ReadItems().Count() > 0)
authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
authResult = await authContext.AcquireTokenAsync(ResourceUri, clientId, returnUri, parent);
} catch (Exception ee) {
throw ex;
}
using (var httpClient = new HttpClient()) {
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, $"{ResourceUri}/api/Band/")) {
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
using (var response = await httpClient.SendAsync(request)) {
string responseData = await response.Content.ReadAsStringAsync();
//responseData always equals "You do not have permission to view this directory or page"
return results;
}
}
}
编辑: 可能有助于注意我正在使用由 Rest API 调用的 DataAPI,其余 API 由 Azure AD 保护。
编辑: 我正在从便携式 Class 图书馆打电话。
编辑: 好吧,我正在通过身份验证,但这似乎没有任何区别。如果我完全删除 Auth header 我会得到相同的结果
似乎令牌对于受 Azure AD 保护的 Web API 不正确。请检查令牌中的 aud
声明,该声明应与您在 Web API 项目中配置的 Audience
匹配。您可以通过解析此 site.
aud
声明
如果问题仍然存在,请分享您如何保护网络的代码 API。
更新
如果您正在使用如下所示的 Express 模式,您需要使用与网络关联的应用程序 API 获取 access_token。
如果您使用的是 Advanced 模式,我们还应该使用该应用程序来获取令牌,并且 ResourceUri 应该与您在 ALLOWED 中配置的值相匹配代币观众 如下所示: