收到的身份验证响应没有预期的accessToken

问题描述

我正在使用https://github.com/Azure-Samples/active-directory-b2c-ios-swift-native-msal,可以完全进入交互式登录流程,但是我无法正确地获得令牌。当我在AD B2C门户中的策略上执行“运行流”时,当我重定向到jwt.ms时,我会获得令牌。

我也启用了详细日志和pii日志记录。授权网址正确解析。

我还为Azure门户中的隐式流启用了访问令牌和ID令牌。我尝试传递空白的作用域数组以及'openid'/ etc,这告诉我那些是保留的而不是传递。

如果我有令牌,我计划使用天蓝色函数(而不是示例中的图形)。

任何帮助都将不胜感激,因为我花了大量时间对此进行了研究。我在stackoverflow线程上看到“ msal”在文档中不正确,并更新为msauth.clientid:// auth,我也曾尝试无济于事。

我以以前创建的本地帐户登录

// Modified from https://stackoverflow.com/a/40410624/12854372

// In a constexpr context,ContextIsConstexpr1(size_t) always
// simply sets _s to 1 successfully.

extern bool no_symbol_s_is_zero;

struct ContextIsConstexpr1 {
    size_t _s;

    constexpr ContextIsConstexpr1(size_t s) : _s(s ? 1 : no_symbol_s_is_zero) {}
};

// In a constexpr context,ContextIsConstexpr2(size_t) will cause
// a compile-time error if 0 is passed to the constructor

struct ContextIsConstexpr2 {
    size_t _s;

    constexpr ContextIsConstexpr2(size_t s) : _s(1) {
        if(!s) {
            throw logic_error("s is zero");
        }
    }
};

// Accept one of the above. By using a CONVERSION constructor
// and passing in a size_t parameter,it DOES make a difference.

ContextIsConstexpr1 foo(ContextIsConstexpr1 c) { return c; }
ContextIsConstexpr2 bar(ContextIsConstexpr2 c) { return c; }

解决方法

这个问题的解决方案是我要发布给他人的解决方案,因为它确实可以对文档或错误代码进行一些改进。我不认为它仅适用于Azure Function api。

在azure b2c门户中,如果您运行登录流程,则浏览器将显示openid的范围(可能也具有配置文件)。因此,您会认为在使用MSAL时,也应该将此作为范围传递。如果这样做,您将收到一条错误消息,指出openid和配置文件是MSAL管理的保留范围,并且不会将它们传递进来。

您会认为这很好,它可以为您处理,不会引起问题,即您无法获取令牌并继续寻找其他问题...从而将范围保留为空白数组。您甚至可能不需要在api中使用特殊范围或权限来限制用户。

但是,最终结果是,如果您要在azure b2c租户区域中“公开api”,它将指出您必须创建至少一个自定义范围和至少一个许可,并且必须至少请求一个自定义范围。另外,您必须设置一个应用程序ID URI。创建一个自定义范围,并将其传递给MSAL,您将获得令牌。

因此,从azure门户运行流时,您不需要自定义范围或已指定App ID Uri,但是如果您使用的是MSAL,则需要这样做。一定有一个原因,但目前对我来说真的没有意义。

希望这对某人有帮助。

,

您可以通过implicit flow获得访问令牌和ID令牌。如果您获得id_token而不是access_token,请选中response_type以包含令牌,而不仅仅是id_token。

注意:请确保添加如下范围格式:https://YOUR_TENANT.onmicrosoft.com/api/user_impersonation

GET https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?
client_id=xxxxxxx
&response_type=id_token+token
&redirect_uri=xxxxx
&response_mode=fragment
&scope=openid%20offline_access%20https%3A%2F%2F{tenant}.onmicrosoft.com%2Fxxxx%2Fuser_impersonation
&state=123456
&nonce=12345