问题描述
我正在使用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