无法从AAD获取承载令牌以使用Web API

时间:2016-10-27 19:23:16

标签: azure authentication azure-web-sites azure-active-directory

我正在尝试保护我的Web API应用程序,以便只有特定用户和应用程序才能使用这些服务。我遵循了许多不同的说明,这些说明表明我有以下代码进行身份验证(我已将其简化为可在控制台应用程序中轻松重现):

class Program
{
    private const string ServicesClientId = "11111111-1111-1111-1111-111111111111";
    private const string ClientId = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa";
    private const string ClientKey = "abcdefghijklmnopqrstuvwxyz1234567890=";
    private const string AadLoginUri = "https://login.windows.net/{0}";
    private const string TenantId = "example.onmicrosoft.com";

    private static readonly string Authority = string.Format(CultureInfo.InvariantCulture, AadLoginUri, TenantId);

    static void Main(string[] args)
    {
        var clientCredential = new ClientCredential(ClientId, ClientKey);
        var context = new AuthenticationContext(Authority, false);

        // This line fails!
        var appAuthResult = context.AcquireToken(ServicesClientId, clientCredential);
        // AADSTS50105: Application 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' is not
        // assigned to a role for the application '11111111-1111-1111-1111-111111111111'.

        var appAuthTokenProvider = new ApplicationTokenProvider(context, "https://example.azurewebsites.net", clientCredential, appAuthResult);
        var tokenCreds = new TokenCredentials(appAuthTokenProvider);

        Console.WriteLine(tokenCreds.ToString());
        Console.ReadLine();
    }
}

因此,只要禁用了用户分配但是启用了用户分配的时刻(并等待一分钟,因为即使它表示已成功启用它似乎没有立即生效),此代码也可以很好地工作失败。

User Asignment Setting in the Azure Portal

我收到以下错误:

  

AADSTS50105:应用程序'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa'不是   分配给应用程序的角色   '11111111-1111-1111-1111-111111111111'。

我该怎么做才能让它发挥作用?

我已经尝试过各种各样的事情,以便在没有运气的情况下让它消失。我尝试过的事情:

  1. 将我的注册客户端的默认“访问MyWebAPI”权限添加到已注册的Web API项目
  2. 更改Web API应用程序的清单以添加App角色: { "allowedMemberTypes": [ "Application" ], "displayName": "Universal App Client", "id": "c27e3fa1-e96a-445c-aaf7-8cbb60cca980", "isEnabled": true, "description": "Application Consuming all Services.", "value": "AppClient" } 然后设置应用程序权限(在已注册的使用应用程序上)以获得此新的“通用应用程序客户端”权限。
  3. 更改Web API应用程序的清单,以在knownClientApplications阵列下添加使用应用程序的客户端ID。
  4. 我已多次重新配置我的Web API应用程序,以防我通过故障排除过程进行了充实但我总是最终
  5. 揉我的肚子拍拍我的头。
  6. 我不确定下一步该尝试什么。

    供参考,这是我的packages.config文件:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.28.1" targetFramework="net46" />
      <package id="Microsoft.Rest.ClientRuntime" version="1.8.2" targetFramework="net46" />
      <package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="0.11.3" targetFramework="net46" />
      <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net46" />
    </packages>
    

    这个问题与this other question类似,但如上所述,该问题(重新配置和重新部署)的答案对我不起作用。

1 个答案:

答案 0 :(得分:2)

我也可以重现这个问题。我发现当我向应用程序角色授予Web API时,该角色可能未按预期授予。这是图供您参考: enter image description here

作为限制用户和应用程序的解决方法,我们可以在Web API中对其进行编码,以便自己实现令牌处理程序。例如,我们可以配置允许的用户,应用程序,然后解析访问令牌以检索appidupn以验证它。有关自定义令牌处理程序的更多详细信息,您可以参考this thread

对于原始问题,我也试图在内部报告。