C# Swagger UI将返回API数据,但我的授权调用返回“权限被拒绝”

C# Swagger UI将返回API数据,但我的授权调用返回“权限被拒绝”,c#,rest,swagger,azure-active-directory,webapi2,C#,Rest,Swagger,Azure Active Directory,Webapi2,所以我相信我的服务应该是好的,因为我可以通过招摇返回结果?我是从WPF项目打来的。我启动程序,它要求我登录,然后它继续,并会告诉我我没有权限 我对WebAPI2非常熟悉,我想我可能只是构造了错误的调用。看起来我确实从我的站点正确地得到了一个令牌,唯一的问题是当我试图实际调用API获取数据时 这是我的密码: public static string clientId = "{#Calling App Id}"; public static string commonAuthority = "htt

所以我相信我的服务应该是好的,因为我可以通过招摇返回结果?我是从WPF项目打来的。我启动程序,它要求我登录,然后它继续,并会告诉我我没有权限

我对WebAPI2非常熟悉,我想我可能只是构造了错误的调用。看起来我确实从我的站点正确地得到了一个令牌,唯一的问题是当我试图实际调用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;
                }
            }
        }
编辑:请注意,我使用的DataAPI由Rest API调用,Rest API由Azure AD保护

编辑:我是从一个可移植类库打电话来的


编辑:嗯,我正在得到认证,但它似乎没有任何区别。如果我完全删除了Auth头,我会得到相同的结果,似乎令牌对于受Azure AD保护的web API不正确。请检查令牌中的aud声明,该声明应与您在web API项目中配置的受众相匹配。您可以通过解析此表中的令牌来检查aud声明

如果您仍然有问题,请分享您如何保护web API的代码

使现代化 如果您使用的是如下所示的Express模式,则需要使用与web API关联的应用程序获取access_令牌


如果您使用的是高级模式,我们还应该使用该应用程序来获取令牌,ResourceUri应该与您在允许的令牌访问群体中配置的值相匹配,如下所示:

我认为我的web api项目中没有访问群体,但它是正确的资源ID。我已将数据层设置为仅使用服务主体接受来自rest层的调用,如上所述此处:@markokstate您正在使用身份验证/授权功能保护web API提供Azure应用程序服务。您为web API项目配置了哪种模式,Express还是Advanced?如果您使用的是Express模式,请确保您使用与web API关联的应用程序获取access_令牌。如果您使用的是高级模式,您还应该使用该应用程序获取令牌,ResourceUri应该与您在允许的令牌访问群体中配置的值相匹配。此外,请确保您没有编写任何代码来保护web API,因为您使用了身份验证/授权功能。因此,我试图简化问题,使其更容易解决可以理解。我删除了服务主体层代码,并删除了数据层的调用web api。我能够在没有身份验证的情况下获得结果,所以这是一个小小的胜利。重新添加层,一旦我强制对数据层进行身份验证,我就会得到与以前相同的错误,因此我认为问题可能就在这里。我已经创建了我的本机客户端应用程序和数据层应用程序,并分别授予了它们的权限。仍然得到相同的错误。我在身份验证设置中看不到允许的令牌。@markokstate似乎有一些误解。为了让解释更清楚,我更新了帖子,使其包含两个数字。如果你还有问题,请随时告诉我。