我在努力搜寻之后发出信号弹。我觉得我真的很快就能把这项工作做好了,但却遇到了麻烦。下面详细介绍了我正在努力完成的任务和目前所采取的步骤。请指出错误并尽可能提出建议。


我有一个在azure中注册的oauth/openid/oidc应用程序,希望使用证书来验证我的客户端,而不是客户端机密。


我生成了一个证书,导出并将公共部分上载到配置的"证书和机密"部分。指纹:3BC87980310C490A62AA5F6343D4C55DF8EBBA85

具有修改值的清单…

"密钥凭据":[ { "customkeyidentifier":"3BC87980310C490A62AA5F6343D4C55DF8EBBA85", "enddate":"2020-10-10T19:45:00Z", "keyid":"ff3ce8e8-7268-4b46-88be-d3a191a0695e", "startdate":"2019-10-10t19:45:00z", "type":"不对称x509cert", "用法":"验证", "value":"ls0tls1crudjtibdrvjusuzjq0furs0tls0….", "displayname":"l=mycity,[email protected],cn=jarred test oauth,ou=federation,o=12345"


认证非常简单,能够获得授权码。我用私有证书签署了我的客户断言jwt:

标题:{ "alg":"rs256", "类型":"JWT" }

负载:{ "iss":"2f877daa-b6f5-42a3-8430-acf238b234e1", "sub":"2f877daa-b6f5-42a3-8430-acf238b234e1", "NBF":1570803651, "出口":157087251, "IAT":157083651, "JTI":"3BC87980310C490A62AA5F6343D4C55DF8EBBA85", "类型":"JWT" }

"iss"和"sub"是我的应用在azure中的客户端id。


我试着用postman中的以下代码测试令牌的交换:

职务: https://login.microsoftonline.com/my-tenant/oauth2/v2.0/token

标题: 内容类型=应用程序/x-www-form-urlencoded

正文: grant_type=授权代码

代码=获得的代码

客户端断言类型=urn:ietf:params:oauth:客户端断言类型:jwt承载

客户端断言=当你的工作环境是关于一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家对一个国家来说是一个国家对一个国家对一个国家对一个国家来说是一个国家对一个国家对一个国家对一个国家对一个国家对一个国家的jcqtg1iiwidhlwijoislduin0.t8larfodxkho9ps9o3q7vh55prl6ntcikebsz-hd型L0V6I7IWI4N-1VBNM-NfuhkkNHBOGAASKv0EqqqqmxyDB7oE75 KgBCJaczy2oI3199JVxJSBHB9JVxN4M6urr23IWWB2008V7oE7KgL77oE7KgG9JVxJSBHB9JVxJSBHB9JVxWW6W6W6W6W6V6V6V6I7V6I7i7L0L0L0L0L0V6V6V6I7i7L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0VxKgKg33撸oekoefru5cyc0ivtslhsoz7lktsmj22zxiyfqvddenjc8w


从azure发送请求会产生以下错误(在postman中):

{ "error":"无效的请求", "错误描述":"aadsts5002723:无效的JWT令牌。令牌头中没有指定证书指纹或密钥ID。\r\n密钥ID:89F69560-9AE7-482F-803C-9FAA71D44100\r\n相关ID:E2EBAB72-8B4D-47A6-85BE-14893158DD5E\r\n时间戳:2019-10-11 14:23:32Z", "错误代码":[ 5002723个 ]我是说, "时间戳":"2019-10-11 14:23:32Z", "trace_id":"89F69560-9AE7-482F-803C-9FAA71D44100", "相关ID":"E2EBAB72-8B4D-47A6-85BE-14893158DD5E" }

我假设标题应该包含一个kid或"thumbprint"值。我没有孩子,因为我没有为此目的建立面向公众的JWKS,也不知道输入什么作为指纹字段。


非常感谢有人能给我指一个正确的方向。我已经看过所有提到别人的帖子了。我真的需要一个知道下一步该怎么做的人。


以下是一些工具和文档,它们让我走到了这一步:

JWT签名工具- http://kjur.github.io/jsjws/tool_jwt.html

解释了OAuth客户端身份验证- https://medium.com/@darutk/oauth-2-0-client-authentication-4b5f929305d4

RFC 7523 OAuth JWT断言配置文件- https://tools.ietf.org/html/rfc7523#section-2.2

微软博客- https://blogs.msdn.microsoft.com/exchangedev/2015/01/21/building-daemon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow/

json web令牌(jwt)-声明和签名 草稿-jones-json-web-token-01- https://tools.ietf.org/id/draft-jones-json-web-token-01.html

用于客户端身份验证的KB- https://kb.authlete.com/en/s/oauth-and-openid-connect/a/client-secret-jwt

谢谢您!

--刺耳的

最佳回复

在找到答案之前不得不惊慌失措。5天的搜索,这是我的发现,以防其他人发现这个问题并需要帮助。

快速步骤:

生成私钥(下面使用powershell)

生成您的公共证书

将您的公共证书和私钥转换为PEM格式

将您的公共证书上载到"证书和机密"下的应用程序配置

在Base64中获取证书的指纹(创建证书时获取或从密钥库或其他位置查找)

$cert=New-SelfSignedCertificate -Subject "CN=$ApplicationName" -CertStoreLocation "Cert:\CurrentUser\My"  -NotAfter (Get-Date).AddMonths(24) -KeyExportPolicy Exportable -KeySpec Signature
$bin = $cert.RawData
$base64Value = [System.Convert]::ToBase64String($bin)
$bin = $cert.GetCertHash()
$base64Thumbprint = [System.Convert]::ToBase64String($bin)

    建立你的JWT(我用 https://jwt.io/

    标题

    {
      "alg": "RS256",
      "typ": "JWT",
      "x5t": "<Base64 Thumbprint>"
    }
    

    有效载荷

    {
      "iss": "<clientid>",
      "sub": "<clientid>",
      "exp": 1570838377 (expiration time),
      "jti": "<random unique identifier>",
      "aud": "https://<token-endpoint>"
    }
    

    将您的私钥(pem)放入底部的verify er,它将在"encoded"窗口中签署您的jwt。

      获取您的授权码

      设计您的代币请求

      标题

      Content-Type: application/x-www-form-urlencoded
      

      身体

      grant_type=authorization_code
      code=OAQABAAIAAACQN9QBR.... (your authorization code)
      client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
      client_assertion=eyJhbGciOiJSUzI1NiIsInR5.... (your signed JWT)
      state=state (optional)
      redirect_uri=https%3A%2F%2Fblackhole.com (The callback URI)
      

        投递到令牌终结点。如果一切按计划进行,你应该收到你的代币。