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

时间:2017-02-14 07:45:12

标签: asp.net authentication jwt azure-active-directory

有两个使用承载令牌身份验证的ASP.NET Core Web API。这些服务还提供静态文件,用于将API同意到消费应用程序的目录中。因此,两个API都在Azure AD中启用了隐式流。

API2使用jwt-bearer grant从Web API控制器调用API1。 API2有权访问API1。

来自第三个目录的用户导航到API2提供的SPA。用户被重定向到Azure AD,登录并同意API。用户被重定向回SPA应用程序,并对API2 Web API进行AJAX调用。从该控制器,再次调用API1。此调用使用jwt-bearer grant(urn:ietf:params:oauth:grant-type:jwt-bearer)进行身份验证。

当使用API​​2的客户端凭据和用于调用API2的JWT令牌进行AcquireToken调用时,Azure AD会响应错误:

Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException: 
AADSTS50027: Invalid JWT token. AADSTS50027: Invalid JWT token. Token format not valid.
Trace ID: 4031717e-aa0c-4432-bbd1-b97a738d3e6f
Correlation ID: 61ae6cd6-6df6-49ee-9145-c16570c28f7b
Timestamp: 2017-02-13 22:44:01Z ---> System.Net.Http.HttpRequestException:  Response status code does not indicate success: 400 (BadRequest). ---> System.Exception: {"error":"invalid_request","error_description":"AADSTS50027: Invalid JWT token. AADSTS50027: Invalid JWT token. Token format not valid.\r\nTrace ID: 4031717e-aa0c-4432-bbd1-b97a738d3e6f\r\nCorrelation ID: 61ae6cd6-6df6-49ee-9145-c16570c28f7b\r\nTimestamp: 2017-02-13 22:44:01Z","error_codes":[50027,50027],"timestamp":"2017-02-13 22:44:01Z","trace_id":"4031717e-aa0c-4432-bbd1-b97a738d3e6f","correlation_id":"61ae6cd6-6df6-49ee-9145-c16570c28f7b"}

谁能告诉我这个错误意味着什么? JWT令牌本身是正确的,它必须是Azure AD不喜欢的声明之一。

我在this github repo中有示例应用和重复步骤。

修改 图表可以澄清我尝试做的事情。是#3的交互给了我错误。它使用ClientCredential和Client2d的API2和ClientSecret(或密钥)以及由Directory3发布的橙色JWT令牌和API2的受众。 enter image description here

橙色JWT令牌如下:

  

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Il9VZ3FYR190TUxkdVNKMVQ4Y2FIeFU3Y090YyIsImtpZCI6Il9VZ3FYR190TUxkdVNKMVQ4Y2FIeFU3Y090YyJ9.eyJhdWQiOiJmOTJjNGI5MS05NTY3LTRjYjgtOTI4MC0yYmFjNDUyYmZjZTEiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9iYWRiODcyNC1jODExLTRlYjEtOTcwZi04YmI4MzU0NTI0OTEvIiwiaWF0IjoxNDg3MDM1MDI5LCJuYmYiOjE0ODcwMzUwMjksImV4cCI6MTQ4NzAzODkyOSwiYW1yIjpbInB3ZCJdLCJmYW1pbHlfbmFtZSI6Im9uZSIsImdpdmVuX25hbWUiOiJ1c2VyIiwiaXBhZGRyIjoiNzMuMTU3LjExMC4xNjQiLCJuYW1lIjoidXNlciBvbmUiLCJub25jZSI6ImRjOTYwMjkzLWQ0MTItNDFmNy1iMGRhLWYzZWM2NTE1ZTM1YSIsIm9pZCI6IjUzMTE1OTY0LWQwOTMtNGM5NS05MDkzLTg0ZjliNzVmYzNlOSIsInBsYXRmIjoiMyIsInN1YiI6IlVjVFVleGJYd1BWYkZ4aGRDUW9MR25vTkdsZnVQWi1feGtaSndIdU9zM1EiLCJ0aWQiOiJiYWRiODcyNC1jODExLTRlYjEtOTcwZi04YmI4MzU0NTI0OTEiLCJ1bmlxdWVfbmFtZSI6InVzZXIxQHppZWtlbmh1aXNBLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6InVzZXIxQHppZWtlbmh1aXNBLm9ubWljcm9zb2Z0LmNvbSIsInZlciI6IjEuMCJ9.lhwEL3x3Cu66l-DT-hWmH2DrmCCX2YORGhl4x4_13_lZuUVhMr1OFLUdJ4MZRWG5DJMc8F_SyC4XdDiStwFDaLSI_4L6noXNau3KF6S u3PnqD-FoXoQPtmPPmFrDRZ7nPEtSazEcd9HeSwgVvRZywJRBKQqQQtBGBpS7-Y9kxrO-moUhnBdJJ-gwhu_wxwdEZaOuLs68sZuFaONAunElMKO1iYlC9VHP5xrVzh3ErnRSIp3xmgJNmlbf-9AFUSrjN5UaFjfpGGGJIvoaKbL6rq-J1XNpvKZDFYvoC7RMkqS1KM录-EI7-QCksb3NKhTg6J_bz5uxmjYltjKanWbUg

1 个答案:

答案 0 :(得分:1)

首先,要启用API2,用户可以获取API1的令牌,我们需要在Directory2中注册API2时将API1授予API2,如下所示: enter image description here

然后,由于API1的服务主体也未在 Directory3 中创建,我们需要首先登录API1以在 Directory3 上创建API1的服务主体承租人。

当用户从 Directory3 登录SPA并将请求发送到API2时,您在代码中从 Directory2 获取令牌。我们应该从用户租户( Directory3 )获取令牌。

在代码中,您使用 clientId 获取令牌,在此secnario中,我们应该使用如下所示的ClientCredential

var result = await adal.AcquireTokenAsync(resource, clientCred, userAssertion);

更改后,代码适合我。请告诉我它是否有帮助。

此外,您正在开发的方案如下所示,您可以参考此link中的详细信息。 enter image description here