4
4

4 回答 4

0

对我来说,解决方案是将标准设置中 azure 函数的安全性更改为匿名(来自函数)......似乎除了不记名令牌之外,它还期待一个函数代码......花了我 5 多个小时找出来,因为我所有的注意力都集中在 JWT 访问令牌或 AADB2C 配置等可能有什么问题上......

哎呀,也许我在错误的线程中发布了这个,我实际上得到了 401 ......

于 2019-06-18T10:07:59.197 回答
0

这不是您的租户的发行人:

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 中添加到允许的受众。

于 2019-06-02T20:29:56.100 回答
0

与您描述的问题相同,尽管发布的回复我能够通过将权限更改为来解决它:

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);
    }
});
于 2019-06-05T09:44:07.640 回答
0

问题实际上在于 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"。修复样本后将在此处更新。

于 2019-09-08T18:14:22.857 回答