我使用ADFS在Web应用程序中设置了登录名。
授权请求如下所示:
https://sso.company.net/adfs/oauth2/authorize?response_type=code&client_id=ruleman&resource=urn:ruleman:1&redirect_uri=http://ruleman.net/authorize
ADFS执行授权并重定向到应用程序:
http://ruleman.net/authorize?code=aaaaaaaa.bbbbbbbbb.ccccccccc
众所周知,代码参数中的令牌包含诸如用户名等声明。如何解码令牌并提取声明?
最佳答案
流程遵循OAuth 2.0标准。请注意,我不是ADFS方面的专家,但是我非常了解OAuth 2.0。
授权流程包含具有不同步骤的多个选项。在您的情况下,您正在使用代码配置文件(指定response_type = code)。您执行的授权步骤只是第一步,需要遵循的几个步骤
您可以搜索“带ADFS的OAuth 2.0”,例如http://blog.scottlogic.com/2015/03/09/OAUTH2-Authentication-with-ADFS-3.0.html
授权请求
../authorize?response_type=code&client_id=ruleman
&resource = urn:ruleman:1&redirect_uri = http://ruleman.net/authorize
您将收到一个OAuth代码(通常不包含任何信息值,它只是一个代码)
http://ruleman.net/authorize?code=aaaaaaaa.bbbbbbbbb.ccccccccc
代码参数包含用户名等声明
这是错误的假设
使用此代码,您需要从后端调用令牌服务以接收访问令牌(例如,使用HttpClient)。
POST /adfs/oauth2/token HTTP/1.1
grant_type=authorization_code&client_id=some-uid-or-
other&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2FgetAToken&code=thecode
您将收到访问令牌。此步骤可确保您的应用程序确实使用其知道的身份提供者进行了身份验证。
根据上面链接的帖子:
有趣的是它本身,它实际上是一个JSON Web令牌(JWT)。也就是说,该签名代表了用户的身份和其他补助。
我无法确认,但是您可以尝试。通常(与其他身份提供者一起),令牌只是一个令牌,客户端需要调用“用户信息”服务来获取任何用户身份声明,但是ADFS似乎为您提供了一些捷径。
然后,您可以使用任何JWT库来解码/验证jwt令牌(com.auth0 / java-jwt / 3.0.1)
com.auth0.jwt.interfaces.DecodedJWT jwt = com.auth0.jwt.JWT.decode(token);