我的Azure应用程序是一个单页应用程序,当尝试通过邀请实现电子邮件注册时,我收到错误:
AADB2C99059:提供的请求必须提供一个code_challenge
我们的应用程序服务器是否生成此code_challenge,或者Azure B2C是否应该为我们执行此操作?此外,我们究竟应该如何生成code_challenge?
您需要通过代码生成code_challenge
并将其传递给请求URL,在获取访问令牌时也使用code_verifier
。
参考-https://medium.com/the-new-control-plane/using-proof-key-for-code-exchange-pkce-in-azure-ad-b2c-9203fbc148fd
C#样品:
using IdentityModel;
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace PKCEConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var random = new Random();
int cvlength = random.Next(43, 128);
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
var codeVerifier = new string (Enumerable.Repeat(chars, cvlength).Select(s => s[random.Next(s.Length)]).ToArray());
string codeChallenge;
using (var sha256 = SHA256.Create())
{
var a = Encoding.UTF8.GetBytes(codeVerifier);
var challengeBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(codeVerifier));
codeChallenge = Base64Url.Encode(challengeBytes);
/* Alternatively instead of using Base64Url.Encode method, the code below can accomplish the same result:
var result = Convert.ToBase64String(challengeBytes)
.Replace('+', '-') // replace URL unsafe characters with safe ones
.Replace('/', '_') // replace URL unsafe characters with safe ones
.Replace("=", ""); // no padding
*/
}
Console.WriteLine("codeVerifier " + codeVerifier + "n");
Console.WriteLine("codeChallenge " + codeChallenge + "n");
Console.ReadLine();
}
}
}
您需要向应用程序发送身份验证请求,并让应用程序发出正确的身份验证请求。你不能只是按原样启动邀请链接,这只是一个测试它的例子
要将这样的链接集成到应用程序中,请参阅:
https://learn.microsoft.com/en-us/azure/active-directory-b2c/enable-authentication-spa-app-options#pass-id令牌提示
对于SPA应用程序,如果您使用MSAL.js库,请初始化MSAL对象中的extraQueryParameters配置键。并传入键值对:id_token_int:id_token-int_value。然后传递正确的B2C策略Id作为权限,然后启动msalObj.loginDirect((。
你的用户应该收到一个链接,比如myApp.com/redempe?id_token=id_token_int_value。