如何使用 MSAL 对 AAD B2C 进行身份验证?
How do you authenticate AAD B2C using MSAL?
我有一个使用 ADAL 的 Client/Server 身份验证的工作版本。但是,当您想使用本地帐户时,B2C AAD 似乎不能很好地与 ADAL 配合使用(也就是说,只有用户名或电子邮件地址,没有 AAD 以外的后备身份验证器)。看来我们应该为本地帐户使用的 API 是 MSAL 的 alpha 版本。到目前为止,一切都很好。我可以使用图表 API 创建本地用户并使用以下代码,我似乎正在对本地用户进行身份验证 'joeconsumer@mycompany.com':
this.pca = new PublicClientApplication("a4828eaa-42f6-418a-8062-f857130b69ce");
AuthenticationResult result = await this.pca.AcquireTokenAsync(
new string[] { "a4828eaa-42f6-418a-8062-f857130b69ce" },
string.Empty,
UiOptions.ForceLogin,
null,
null,
"https://login.microsoftonline.com/" + "darkbondpublic.onmicrosoft.com",
"B2C_1_sign-in");
问题是我使用 WCF 中的自定义安全令牌机制将安全令牌从 'result.Token' 传回服务器。服务器上用于使用 ADAL 的代码似乎不再接受来自上述调用的安全令牌:
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
Microsoft.IdentityModel.Tokens.SecurityToken securityToken = null;
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(userName, this.GetTokenValidationParameters(MetadataAddress), out securityToken);
Thread.CurrentPrincipal = claimsPrincipal;
错误信息是:
谁能告诉我这是怎么回事?我需要在服务器上使用不同的身份验证方法吗?
我认为问题是:您正在向 V1 端点发送请求,但 AAD B2C 使用具有权限的 V2 端点:https://login.microsoftonline.com/tfp/{tenantId}/{政策名称}/v2.0/
v2 端点的元数据位于 https://login.microsoftonline.com/tfp/{tenantId}/{policyName}/。well-known/openid-configuration
你能更新你的网址并再试一次吗?
要在 Azure 门户中查看权限 select 您的策略,则:
- 找到您的保单
- 点击"Edit"
- 点击"Token, session & SSO config"
- 展开"Issuer (iss) claim"
Azure(使用 V1 端点)和 Azure AD B2C(使用 V2 端点)使用不同的密钥集来签署令牌,因此从正确的位置下载 public 密钥很重要 - 最初是您下载的来自 V1,但需要使用 V2。
您为 Azure AD B2C 租户配置的元数据终结点不正确。这是正确的供您参考:
https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration?p=B2C_1_Sign_In
我们可以从新的 Azure 门户中找到特定策略的元数据,如下图所示。
并且在元数据中应该能够看到如下所示的键端点:
https://login.microsoftonline.com/{tenant}/discovery/v2.0/keys?p={policy}
我们可以找到带有kid gfIKIH-yZ3phRHRyjnsHIqZMaePLGAELzPat0CNY4sA
的key,如下图:
对我来说,这个端点有效:
https://{Azure 域}/{Azure 租户}/v2.0/.well-known/openid-configuration?p={Azure 策略}
我有一个使用 ADAL 的 Client/Server 身份验证的工作版本。但是,当您想使用本地帐户时,B2C AAD 似乎不能很好地与 ADAL 配合使用(也就是说,只有用户名或电子邮件地址,没有 AAD 以外的后备身份验证器)。看来我们应该为本地帐户使用的 API 是 MSAL 的 alpha 版本。到目前为止,一切都很好。我可以使用图表 API 创建本地用户并使用以下代码,我似乎正在对本地用户进行身份验证 'joeconsumer@mycompany.com':
this.pca = new PublicClientApplication("a4828eaa-42f6-418a-8062-f857130b69ce");
AuthenticationResult result = await this.pca.AcquireTokenAsync(
new string[] { "a4828eaa-42f6-418a-8062-f857130b69ce" },
string.Empty,
UiOptions.ForceLogin,
null,
null,
"https://login.microsoftonline.com/" + "darkbondpublic.onmicrosoft.com",
"B2C_1_sign-in");
问题是我使用 WCF 中的自定义安全令牌机制将安全令牌从 'result.Token' 传回服务器。服务器上用于使用 ADAL 的代码似乎不再接受来自上述调用的安全令牌:
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
Microsoft.IdentityModel.Tokens.SecurityToken securityToken = null;
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(userName, this.GetTokenValidationParameters(MetadataAddress), out securityToken);
Thread.CurrentPrincipal = claimsPrincipal;
错误信息是:
谁能告诉我这是怎么回事?我需要在服务器上使用不同的身份验证方法吗?
我认为问题是:您正在向 V1 端点发送请求,但 AAD B2C 使用具有权限的 V2 端点:https://login.microsoftonline.com/tfp/{tenantId}/{政策名称}/v2.0/
v2 端点的元数据位于 https://login.microsoftonline.com/tfp/{tenantId}/{policyName}/。well-known/openid-configuration
你能更新你的网址并再试一次吗?
要在 Azure 门户中查看权限 select 您的策略,则:
- 找到您的保单
- 点击"Edit"
- 点击"Token, session & SSO config"
- 展开"Issuer (iss) claim"
Azure(使用 V1 端点)和 Azure AD B2C(使用 V2 端点)使用不同的密钥集来签署令牌,因此从正确的位置下载 public 密钥很重要 - 最初是您下载的来自 V1,但需要使用 V2。
您为 Azure AD B2C 租户配置的元数据终结点不正确。这是正确的供您参考:
https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration?p=B2C_1_Sign_In
我们可以从新的 Azure 门户中找到特定策略的元数据,如下图所示。
并且在元数据中应该能够看到如下所示的键端点:
https://login.microsoftonline.com/{tenant}/discovery/v2.0/keys?p={policy}
我们可以找到带有kid gfIKIH-yZ3phRHRyjnsHIqZMaePLGAELzPat0CNY4sA
的key,如下图:
对我来说,这个端点有效:
https://{Azure 域}/{Azure 租户}/v2.0/.well-known/openid-configuration?p={Azure 策略}