Azure AD中代表jwt-bearer的授权问题

时间:2018-05-14 22:13:24

标签: asp.net azure oauth-2.0 azure-active-directory oidc

所以我有一个Angular应用程序,它使用adal-angular库来验证ASP.NET Core 2.0 Web API。然后,API使用代表流来使用用户令牌(例如此MS文章https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-on-behalf-of)对另一个API进行身份验证。

我遇到的问题是这在DEV环境中工作正常,但我现在已经部署了一个带有单独应用程序注册的TST环境,当我尝试使用代表

  

AADSTS240002:输入id_token不能用作' urn:ietf:params:oauth:grant-type:jwt-bearer'授予。

我用来请求令牌的代码

public async Task<string> AcquireTokenAsync(string resource)
    {
        try
        {
            string accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync(AuthenticationConstants.AccessToken);

            var credentials = new ClientCredential(_azureOptions.ClientId, _azureOptions.ClientSecret);
            var authContext = new AuthenticationContext($"{_azureOptions.Instance}{_azureOptions.TenantId}")
            {
                ExtendedLifeTimeEnabled = true
            };

            // On-behalf-of auth token request call
            var authResult = await authContext.AcquireTokenAsync(
                resource,
                credentials,
                new UserAssertion(accessToken));

            return authResult.AccessToken;
        }
        catch (AdalServiceException asex)
        {
            _logger.LogError(asex, $"Instance: {_azureOptions.Instance} Tenant: {_azureOptions.TenantId} ClientId: {_azureOptions.ClientId}");
            throw;
        }
        catch (System.Exception ex)
        {
            _logger.LogError(ex, ex.Message);
            throw;
        }
    }

我使用了Fiddler Fiddler,看起来所有正确的参数都被传递了。

非常感谢任何帮助。我已在第二个API上设置了knownClientApplications,并且我已将Angular后端API的权限授予第二个API。

3 个答案:

答案 0 :(得分:3)

对我来说,将以下两项都更改为 true 可以使它起作用: oauth2AllowImplicitFlow oauth2AllowIdTokenImplicitFlow

有关更多信息,请参见here

答案 1 :(得分:1)

根据您的问题和错误,应该是因为您的角度应用不是原生(公共)应用

对于使用此Grant类型的此OBO流,您的客户端必须是公共客户端而非凭据客户端。

如果您想将客户端注册为WebApp / API,可以参考this Implementation

enter image description here

希望这有帮助!

更新

根据OP的评论,他/她通过将oauth2AllowImplicitFlowfalse更改为true来使其发挥作用。

答案 2 :(得分:0)

即使将 oauth2AllowImplicitFlowoauth2AllowIdTokenImplicitFlow 设置为 true,我也遇到了问题。我的一个回复 URL 中有一个通配符。删除通配符后,问题就解决了。