我创建了 Azure B2C 自定义策略来获取 ID/访问令牌中的声明并通过“authorization_code”授予获取刷新令牌。然后我通过 Azure AD Graph API 更新了用户声明之一,即(“displayName”)。接下来,我尝试通过“refresh_grant”针对相同的 Azure B2C 自定义策略使用上述刷新令牌来获取 ID/访问令牌中更新的声明(“displayName”),但我没有得到它。
我已经在 B2C 策略中尝试过“RefreshTokenUserJourneyId”作为 JWT 颁发者,但没有任何效果。
更新后,我应该如何通过刷新令牌授予来获取 ID/访问令牌中的最新用户声明。
需要帮助。
azure azure-active-directory azure-ad-graph-api azure-ad-b2c identity-experience-framework
我们正在开发一个需要两种不同类型用户的 Web 应用程序:
客户使用其 Azure AD B2C 帐户登录 Web 应用程序。管理员使用其 Azure AD 帐户登录网站的管理 UI 区域。这部分很好。
然而,要求之一是管理员能够冒充客户,以便他们可以代表客户执行某些任务,例如下订单。
我们将使用 OAuth(.NET 包)进行授权。我的问题实际上有两个:
1)OAuth是否支持冒充其他账户?
2) 如果是,Azure AD 中的帐户是否有可能模拟 Azure AD B2C 中的用户 - 目前它们是不同的目录,彼此不可见。
也许我的问题有点模糊,我们正在寻找正确方向的一些指示。
提前谢谢了
点开发
asp.net-mvc single-sign-on oauth-2.0 azure-active-directory azure-ad-b2c
我有一个使用 AzureAD b2c 身份验证(通过 OpenId Connect)的 dotnet core mvc Web 应用程序。当我针对 localhost 运行它时,它可以正常工作,但是当我将解决方案部署到 Kubernetes 并尝试登录时,我收到以下错误:
Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.Exception: An error was encountered while handling the remote login.
---> System.Exception: Unable to unprotect the message.State.
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)'
Run Code Online (Sandbox Code Playgroud)
我已经设置了一个带有 SSL 的 NGINX 入口,它将流量转发到 Kubernetes 中的服务,因此它充当集群内的反向代理。
为了确保保留请求的原始主机名,我已将以下内容添加到startup.cs:
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
options.KnownNetworks.Clear();
options.KnownProxies.Clear(); …Run Code Online (Sandbox Code Playgroud) 我们正在使用 Hasura 向消费者提供 GraphQL API。目前我们使用 Auth0 对用户进行身份验证,但我们希望迁移到 Azure AD B2C。
Hasura的 JWT 安全性要求是使用“ https://hasura.io/jwt/claims ”命名空间来提供自定义声明(例如 X-Hasura-Org-Id、X-Hasura-App-Id 等)。
我已经能够通过 AAD B2C 来:
string/值转换为 JSON 对象 和stringCollectionClaimsTransformation但是,我无法弄清楚如何在不转义内容的情况下让 JSON 对象出现在最终的 JWT 中 - 即作为字符串而不是对象输出。
AAD B2C 是否能够输出 JWT 中的嵌套对象?
这就是 Hasura 希望 JWT 命名空间的样子(注意对象https://hasura.io/jwt/claims)
{
"exp": 1588405829,
"nbf": 1588402229,
"ver": "1.0",
"iss": "https://<redacted>.b2clogin.com/<redacted>/v2.0/",
"sub": "<redacted>",
"aud": "<redacted>",
"acr": "b2c_1a_aaa_signupsignin",
"nonce": "defaultNonce",
"iat": 1588402229,
"auth_time": 1588402229,
"given_name": "Test", …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置 AD B2C,并遵循我在网上找到的各种教程。我正在测试用户流程。我可以成功登录,但是当我重定向到 时https://jwt.ms,它什么也没显示:
但是,我注意到我的 URL 与教程中显示的不同。它有一个code而不是id_token:
https://jwt.ms/?code=eyJraW...
Run Code Online (Sandbox Code Playgroud)
我一直试图找出导致 B2C 使用代码而不是 ID 令牌进行重定向的原因,但没有成功。谁能告诉我为什么会发生这种情况?
更新
好的,我现在明白是什么原因造成的,但不太明白我的设置与我在教程中看到的设置有何不同。我发现,如果我在应用程序注册中启用隐式授权,如下所示:
然后一切都会按预期进行。请注意,我必须启用两者。
我还注意到,当我测试用户流时,这些隐式授权的状态决定了它是否具有response_type=code或response_type=id_token位于授权 URL 中:
response_type除了更改隐式授予的状态之外,似乎没有其他方法可以在测试用户流程 UI 中设置所需的值。也许这是自教程制作以来 Azure 门户中行为的变化……?
请参阅下面的更新
我正在使用 Azure AD B2C,希望我的用户能够通过我的 Web 应用程序登录,并能够利用 JWT 不记名令牌并从移动应用程序调用 Web API 方法。
我可以让任一身份验证方案自行工作。例如,在我的startup.cs中我可以执行以下操作:
services
.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
其按预期工作(用户可以登录网站,但 JWT 不起作用)。
或者,我可以使用以下内容,然后只有 JWT 不记名令牌才可以工作:
services
.AddAuthentication(AzureADB2CDefaults.JwtBearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
如果我想要其中任何一个工作,我可以执行以下操作(在/sf/answers/3479447331/的帮助下)
services
.AddAuthentication()
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options))
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(AzureADB2CDefaults.AuthenticationScheme, AzureADB2CDefaults.JwtBearerAuthenticationScheme)
.Build();
}
Run Code Online (Sandbox Code Playgroud)
现在两者都可以工作。(编辑:实际上,它们并不能完全工作)
但是,我也有这个代码:
app.UseAuthentication();
app.UseMiddleware<MyAfterAuthenticatedMiddleware>();
app.UseAuthorization();
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用任一身份验证的组合时,当我的中间件代码运行时,我的用户未经过身份验证(在中间件代码中)并且没有声明等,但稍后在管道中获取它们。
这里发生了什么事?如何解决这个问题?
看来,当我不指定默认身份验证方案时(为了拥有多个方案),直到管道中的授权步骤时,身份验证才会发生。
我需要我的中间件在身份验证之后和授权之前运行。如何通过多种身份验证方案实现这一点?
更新——解决了!但一定有更好的方法!
首先,我要向那些创建 .NET 安全产品的人们表示敬意。这很重要,也很困难。但我确实认为可能还有很大的改进空间。
大多数开发人员在必要时都会涉足安全领域,然后又回到他们的“常规”工作中。除非你每天都使用它,否则很难保持领先。每次你回到它时,一切都会再次改变。
这一定是一个常见的场景:我希望我的用户能够登录我的网站并与各种 Web API 方法进行交互。我希望他们也能够通过其他方式访问这些相同的 API …
我一直在使用有关 ContentDefinitions 的b2c 入门包和MSDN 文档,以及 Azure B2C 产品的各个其他方面。
正如任何曾经尝试实施自定义策略的人所意识到的那样,文档并不总是那么彻底或明确,并且通常在语法上不正确或缺少细节。
考虑到这一点,我想知道:
<Item Key="setting.showSignupLink">false</Item>元数据来将“注册”屏幕链接添加到 ContentDefinition,但在使用 ContentDefinition 时,该链接似乎是开箱即用的api.signuporsignin。<Item Key="setting.showSigninLink">false</Item>到我的 ContentDefinition 的元数据块中,但无济于事(我没有在任何地方的 MSDN 文档中找到此内容,只是想尝试一下)。为了澄清,在注册/登录流程中,我想在启动策略后立即显示“注册”屏幕,然后可以选择导航到“登录”页面。
任何建议将不胜感激。
在登录/重置密码流程中的不同步骤上单击“下一步/继续”按钮时,Azure B2C 页面会引发内容安全策略错误。如果我输入电子邮件(或没有电子邮件)并在登录的第一步单击“下一步”按钮,则会引发错误,但如果按 Enter 键,则不会出现错误。
图片1:
原因是,一方面,这些页面上的 CSP 不允许使用内联代码,但另一方面,Azure B2C 插入了一些内联代码。表单中的 Fe action="javascript:void(0)"。
图片2:
调试 js 代码显示有一行代码阻止( action="javascript:void(0)")在按 Enter 键时调用此内联操作,并且在单击“下一步”按钮时没有此类阻止。不同步骤上的表单中有几个这样的地方。
这部分代码是由Azure B2C生成的。无法更改 CSP,因为它也在 Azure 端设置。事实上,这个错误并不会阻止登录流程,而是在每个步骤上抛出很多错误
有人有同样的问题并建议如何避免吗?
我目前已在 Azure AD B2C 中使用自定义策略实现了以下内容:
有什么方法可以实现用户必须验证两次而不是三次吗?如果用户尚未为其社交帐户设置 2FA,我想保留 2FA。
例如,是否可以检查社交登录是否使用了 2FA?或者是否可以对社交帐户登录实施 2FA?
我的设置使用了以下模板:
我正在使用 Azure AAD B2C 来管理我的用户和身份验证流程。我正在尝试创建一种用户体验,用户可以使用不同的帐户登录。用户应该能够注销其帐户,然后单击登录并能够提供不同的用户名和密码。
但是,目前我退出了。我可以通过 F12 调试器确认所有 cookie 均已清除。然后我单击登录,它让我重新登录到以前的帐户,而无需询问我的用户名和密码。
我不确定发生了什么或为什么。这是我的登录代码。
public IActionResult SignIn([FromRoute] string scheme)
{
scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
var redirectUrl = Url.Content("~/");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl, AllowRefresh = true };
properties.Items["policy"] = "B2C_1_SignUpIn";
return Challenge(properties, scheme);
}
Run Code Online (Sandbox Code Playgroud)
这是我的退出代码。
public async Task<IActionResult> SignOutAsync([FromRoute] string scheme)
{
HttpContext.Session.Clear();
if (HttpContext.Request.Cookies.Count > 0)
{
var test = HttpContext.Request.Cookies.ToList();
var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.Contains(".AspNetCore.") || c.Key.Contains("Microsoft.Authentication"));
foreach (var cookie in siteCookies)
{
Response.Cookies.Delete(cookie.Key);
}
}
await …Run Code Online (Sandbox Code Playgroud) azure-ad-b2c ×10
azure ×4
c# ×3
.net-6.0 ×1
aad-b2c ×1
asp.net-core ×1
asp.net-mvc ×1
hasura ×1
identity-experience-framework ×1
jwt ×1
kubernetes ×1
oauth ×1
oauth-2.0 ×1