如何获得Azure轻松身份验证JWT access_token

Dav*_*arr 5 azure azure-web-sites

我有一个Azure应用服务,已在其上启用身份验证/授权并将AD配置为身份验证提供程序。

/.auth服务上存在所有路由,我可以登录。成功登录后,我可以致电/.auth/me获取access_token。响应如下所示:

[
  {
     "access_token": "AQABAAAAAA...Gni4EiQgAA",
     "expires_on": "2017-02-28T19:17:08.0000000Z",
     "id_token": JWT TOKEN
     ...
  }
]
Run Code Online (Sandbox Code Playgroud)

然后,我access_token在授权承载标头中使用来从服务请求数据。

"Authorization": "Bearer " + "AQABAAAAAA...Gni4EiQgAA"
Run Code Online (Sandbox Code Playgroud)

我的服务返回以下错误

IDX10708: 'System.IdentityModel.Tokens.JwtSecurityTokenHandler' cannot read this string: 'AQABAAAAAA...Gni4EiQgAA'.

The string needs to be in compact JSON format, which is of the form: '<Base64UrlEncodedHeader>.<Base64UrlEndcodedPayload>.<OPTIONAL, Base64UrlEncodedSignature>'.
Run Code Online (Sandbox Code Playgroud)

根据该讨论access_token其旨在用作承载令牌。我在这里还阅读了access_token应该是base64编码的方法,但事实并非如此。

此外,如果我将id_token用作承载令牌,那么身份验证将按预期工作(采用id_tokenJWT格式)。

编辑

当我手动实现所描述的流程的Oauth 这里,我收到一个适当的JWT access_token

GET
https://login.microsoftonline.com/common/oauth2/authorize?client_id=client_id&response_type=code&redirect_uri=redirect_uri
Run Code Online (Sandbox Code Playgroud)

其次是

POST
https://login.microsoftonline.com/common/oauth2/token
  grant_type=authorization_code
  client_id=client_id
  code=CODE FROM ABOVE
  redirect_uri=redirect_uri
  resource=resource
  client_secret=client_secret

RESPONSE
{
  "access_token": JWT TOKEN,
  "token_type": "Bearer",
  ...
}
Run Code Online (Sandbox Code Playgroud)

Bru*_*hen 5

如何获得Azure轻松身份验证JWT access_token

根据您的描述,我启用了身份验证/授权并将AD配置为身份验证提供程序来测试此问题。众所周知,当您在Azure Portal上启用身份验证/授权时,默认response_type值为id_token。您需要登录https://manage.windowsazure.com并更新App Service Auth Configuration,如下所示:

在此处输入图片说明

注意:如果未指定resourcefor additionalLoginParams,则将检索非JSON Web令牌(JWT)格式的access_token。

然后,我在授权承载标头中使用access_token从服务请求数据。

要访问您的服务,您可以利用AppServiceAuthSessionCookie或使用Authorization:Bearer "{your-id-token}"

有关更多详细信息,您可以参考此类似教程