4 回答
对我来说,解决方案是将标准设置中 azure 函数的安全性更改为匿名(来自函数)......似乎除了不记名令牌之外,它还期待一个函数代码......花了我 5 多个小时找出来,因为我所有的注意力都集中在 JWT 访问令牌或 AADB2C 配置等可能有什么问题上......
哎呀,也许我在错误的线程中发布了这个,我实际上得到了 401 ......
这不是您的租户的发行人:
https://<b2c_tenant_name>.b2clogin.com/<b2c_tenant_name>.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=<SignUpAndSignInPolicyName>
但是,如果您在浏览器中打开此 URL,它将显示您搜索的颁发者。
它应该是这样的:
https://<b2c_tenant_name>.b2clogin.com/<b2c_tenant_name>.onmicrosoft.com/v2.0
https://<b2c_tenant_name>.b2clogin.com/<b2c_tenant_guid>.onmicrosoft.com/v2.0
https://<b2c_tenant_name>.b2clogin.com/<b2c_tenant_name>.onmicrosoft.com/SignUpAndSignInPolicyName/v2.0
https://login.microsoftonline.com/<b2c_tenant_name>.onmicrosoft.com/v2.0
为 Azure Function 和 Angular 应用程序选择 b2clogin.com 和 login.microsoftonline.com 也是一个好主意。我不认为你可以像这样混合它们。
如果您仍然有问题,您可以尝试将其作为范围而不是/user_impersonation
:
https://<b2c_tenant_name>.onmicrosoft.com/API/.default
或者尝试https://<b2c_tenant_name>.onmicrosoft.com/API/user_impersonation
在 Azure Function 中添加到允许的受众。
与您描述的问题相同,尽管发布的回复我能够通过将权限更改为来解决它:
https://<b2c_tenant_name>.b2clogin.com/tfp/<b2c_tenant_name>.onmicrosoft.com/<SignUpAndSignInPolicyName>
当我尝试在我的函数应用程序上使用令牌时,标准的 ( https://<b2c_tenant_name>.microsoftonline.com/tfp/<b2c_tenant_name>.onmicrosoft.com/<SignUpAndSignInPolicyName>
) 导致我得到 401
编辑:添加代码示例
虽然我的代码使用反应环境变量,但它只是 JS,并且应该在 Angular 应用程序中同样工作。
import * as Msal from 'msal';
/** @type {import('msal').Configuration} */
const msalConfig = {
auth: {
clientId: process.env.REACT_APP_CLIENT_ID,
authority: 'https://<b2c_tenant_name>.b2clogin.com/tfp/<b2c_tenant_name>.onmicrosoft.com/<SignUpAndSignInPolicyName>',
validateAuthority: false,
navigateToLoginRequestUrl: false,
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: true,
},
};
/** @type {import('msal').AuthenticationParameters} */
const reqParams = {
scopes: [process.env.REACT_APP_SCOPE],
};
const clientApplication = new Msal.UserAgentApplication(msalConfig);
clientApplication.handleRedirectCallback((error, response) => {
if (error) {
if (error.message.indexOf('AADB2C90118') >= 0) {
//User clicked forgot password
clientApplication.authority = 'https://<b2c_tenant_name>.b2clogin.com/tfp/<b2c_tenant_name>.onmicrosoft.com/<ResetPasswordPolicyName>';
clientApplication.loginRedirect(reqParams);
return;
}
return console.error(error);
}
});
问题实际上在于 Web api ( https://fabrikamb2chello.azurewebsites.net/hello )。该示例正在调用此受保护资源,但该示例已对 domain 进行硬编码 login.microsoftonline.com
,这会导致护照库(中间件)出现问题,该库会提取并验证 access_token,将 access_token 中的声明传播到验证回调并让框架完成剩余的认证过程。
由于 web api 使用了不同的权限,因此护照库无法验证令牌,因为login.microsoftonline.com
和之间的权限 url 格式{tenantName}.b2clogin.com
不同。例如,使用 时{tenantName}.b2clogin.com
,必须包含策略,但之前使用 时login.microsoftonline.com
,不必在 url 中包含策略,以便护照验证令牌。
我们将尽快更新 web api 和所有受影响的示例。您可以通过定位此分支来尝试 api 调用,该分支在 localhost:5000 上运行。在代码中,将 api 端点更新为 hit ApiEndpoint = "http://localhost:5000/hello"
。修复样本后将在此处更新。