所以我有一个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环境,当我尝试使用代表来请求令牌时,我收到以下异常p>
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 ,看起来所有正确的参数都被传递了。
非常感谢任何帮助。我已在第二个API上设置了knownClientApplications,并且我已将Angular后端API的权限授予第二个API。
答案 0 :(得分:3)
对我来说,将以下两项都更改为 true 可以使它起作用: oauth2AllowImplicitFlow oauth2AllowIdTokenImplicitFlow
有关更多信息,请参见here。
答案 1 :(得分:1)
根据您的问题和错误,应该是因为您的角度应用不是原生(公共)应用。
对于使用此Grant类型的此OBO流,您的客户端必须是公共客户端而非凭据客户端。
如果您想将客户端注册为WebApp / API,可以参考this Implementation:
希望这有帮助!
更新
根据OP的评论,他/她通过将oauth2AllowImplicitFlow
从false
更改为true
来使其发挥作用。
答案 2 :(得分:0)
即使将 oauth2AllowImplicitFlow
和 oauth2AllowIdTokenImplicitFlow
设置为 true,我也遇到了问题。我的一个回复 URL 中有一个通配符。删除通配符后,问题就解决了。