首页 文章

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

提问于
浏览
2

有两个使用承载令牌身份验证的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 )对此调用进行身份验证 .

当使用API2的客户端凭据和用于调用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中有示例应用和repro步骤 .

EDIT 图表可能会澄清我正在给出错误的交互#3 . 它使用ClientCredential和Client2d的API2和ClientSecret(或密钥)以及由Directory3发布的橙色JWT令牌和API2的受众 .
enter image description here

橙色JWT令牌看起来像:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Il9VZ3FYR190TUxkdVNKMVQ4Y2FIeFU3Y090YyIsImtpZCI6Il9VZ3FYR190TUxkdVNKMVQ4Y2FIeFU3Y090YyJ9.eyJhdWQiOiJmOTJjNGI5MS05NTY3LTRjYjgtOTI4MC0yYmFjNDUyYmZjZTEiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9iYWRiODcyNC1jODExLTRlYjEtOTcwZi04YmI4MzU0NTI0OTEvIiwiaWF0IjoxNDg3MDM1MDI5LCJuYmYiOjE0ODcwMzUwMjksImV4cCI6MTQ4NzAzODkyOSwiYW1yIjpbInB3ZCJdLCJmYW1pbHlfbmFtZSI6Im9uZSIsImdpdmVuX25hbWUiOiJ1c2VyIiwiaXBhZGRyIjoiNzMuMTU3LjExMC4xNjQiLCJuYW1lIjoidXNlciBvbmUiLCJub25jZSI6ImRjOTYwMjkzLWQ0MTItNDFmNy1iMGRhLWYzZWM2NTE1ZTM1YSIsIm9pZCI6IjUzMTE1OTY0LWQwOTMtNGM5NS05MDkzLTg0ZjliNzVmYzNlOSIsInBsYXRmIjoiMyIsInN1YiI6IlVjVFVleGJYd1BWYkZ4aGRDUW9MR25vTkdsZnVQWi1feGtaSndIdU9zM1EiLCJ0aWQiOiJiYWRiODcyNC1jODExLTRlYjEtOTcwZi04YmI4MzU0NTI0OTEiLCJ1bmlxdWVfbmFtZSI6InVzZXIxQHppZWtlbmh1aXNBLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6InVzZXIxQHppZWtlbmh1aXNBLm9ubWljcm9zb2Z0LmNvbSIsInZlciI6IjEuMCJ9.lhwEL3x3Cu66l-DT-hWmH2DrmCCX2YORGhl4x4_13_lZuUVhMr1OFLUdJ4MZRWG5DJMc8F_SyC4XdDiStwFDaLSI_4L6noXNau3KF6Su 3PnqD-FoXoQPtmPPmFrDRZ7nPEtSazEcd9HeSwgVvRZywJRBKQqQQtBGBpS7-Y9kxrO-moUhnBdJJ-gwhu_wxwdEZaOuLs68sZuFaONAunElMKO1iYlC9VHP5xrVzh3ErnRSIp3xmgJNmlbf-9AFUSrjN5UaFjfpGGGJIvoaKbL6rq-J1XNpvKZDFYvoC7RMkqS1KM - 鲁EI7-QCksb3NKhTg6J_bz5uxmjYltjKanWbUg

1 回答

  • 1

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

    然后由于API1的服务主体也没有在 Directory3 中创建,我们需要首先登录API1以在 Directory3 租户上创建API1的服务主体 .

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

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

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

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

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

相关问题