将参数传递给注册策略

2024-04-19

我正在注册策略的帮助下使用社交身份提供商创建 B2C 用户,但我们需要向这个新用户添加一些用户属性(扩展属性)。例如为用户设置“AccountId”。

如果我添加“AccountId”作为注册属性并输入一些值,它工作正常,当我通过图形 API 检查用户属性时,“AccountId”是正确的。

但在这种情况下,“AccountId”不应该是用户可编辑或可见的,我只是希望注册策略将“AccountId”添加到使用例如 facebook 创建的用户,作为注册页面上的隐藏字段。

是否可以从使用 Azure B2C AD 的 ASP.Net MVC 应用程序将此值传递到注册页面并将其与注册属性关联?可以通过参数 (&accountid=1234) 或某些 OpenId-propperties 来完成吗?


Azure AD B2C 可以not当前接受用于填充用户配置文件属性的任何额外查询字符串参数。中有一个这样的请求Azure AD B2C UserVoice 论坛 https://feedback.azure.com/d365community/idea/9750399e-bf25-ec11-b6e6-000d3a4f0789.

但是,您可以通过使用图表在应用程序中自己实现它来获得相同的结果。

对于您的具体示例,您需要确保发送配置注册或注册/登录策略以发送 newUser 声明,然后在身份验证后使用该声明来调用图表并进行必要的更新。

以下是如何实现这一目标的示例,假设您按照以下方式使用 ASP.Net此登录示例 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-web-dotnet or 此注册/登录示例 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-web-dotnet-susi,通过在设置 OpenIdConnectAuthenticationOptions 时利用 SecurityTokenValidated 通知,如下所示:

new OpenIdConnectAuthenticationOptions
{
  // Skipping for brevity
  // (...)
  Notifications = new OpenIdConnectAuthenticationNotifications
  {
    // (...)
    SecurityTokenValidated = OnSecurityTokenValidated
  },
  // (...)
};

并使用 ClientCredentials 流程调用 Graph API 进行更新,如下所示:

private async Task OnSecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
{
  string userObjectId = notification.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")?.Value;
  bool newUser = false;
  bool.TryParse(notification.AuthenticationTicket.Identity.FindFirst("newUser")?.Value, out newUser);

  if (!newUser) return;

  ClientCredential credential = new ClientCredential(graphClientId, graphClientSecret);
  AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/sacacorpb2c.onmicrosoft.com");

  AuthenticationResult result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", credential);

  string body = "{ \"extension_e5bf5a2db0c9415cb62661a70d8f0a68_AccountId\" : \"Your_New_Value"\"}";

  HttpClient http = new HttpClient();
  string url = "https://graph.microsoft.com/beta/users/" + userObjectId + "/";
  HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), url)
  {
    Content = new StringContent(body, Encoding.UTF8, "application/json")
  };
  request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
  HttpResponseMessage response = await http.SendAsync(request);

  return;
}

重要笔记:

  • 如果要更新内置属性,可以使用 Azure AD Graph (https://graph.windows.net https://graph.windows.net),但是如果您想要更新自定义属性,则需要查询 Microsoft Graph 的 Beta 端点(https://graph.microsoft.com https://graph.microsoft.com)。如果您确实选择自定义属性,请注意它们具有更时髦的名称(以 Guid 开头),请使用图形浏览器 https://graphexplorer2.azurewebsites.net,查询 /beta/users 并查看完整的属性名称是什么。
  • 您需要注册一个单独的应用程序(与您用于登录/注册的应用程序不同),并具有与图表对话的权限。看本文 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet有关更多信息,尽管本文并未请求 Azure AD Graph 的权限,但您可能需要按照我之前的观点获取 Microsoft Graph 的权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将参数传递给注册策略 的相关文章

  • 多线程 - 在数组中我应该保护什么?

    我正在编写一些具有全局数组的代码 该数组可以由两个线程访问以进行读写目的 读取或写入一系列索引时不会进行批处理 因此我试图弄清楚是否应该锁定整个数组或仅锁定我当前正在使用的数组索引 最简单的解决方案是将数组视为 CS 并在其周围放置一个大锁

随机推荐

  • 异步获取多个json文件后触发回调

    我有来自旧论坛的 3 个 JSON 文件 其中包含 成员 主题和回复 现在我想通过 javascript jquery 获取 3 个 json 文件来将其呈现在网站上 我可以通过首先获取成员 返回时获取主题以及返回时获取回复来同步完成此操作
  • 使用 PHP 进行安全 FTP 连接

    我有一个带有登录详细信息的安全 FTP 服务器 我正在尝试使用 PHP 连接到该安全 FTP 服务器ftp ssl connect ftp connect and ftp login函数并将所有参数正确传递给该函数 但我惊讶地发现它没有连接
  • 无法在当前状态下启动设备:正在创建

    我在 iOS 8 模拟器的 Xcode 6 中运行应用程序时遇到错误 该错误指出 无法在当前状态下启动设备 正在创建 我尝试重置模拟器的内容 另外 我在安装 Xcode 6 后重新启动了 mac 可能需要修复什么 当我将 Xcode 应用程
  • 没有安排分支的构建

    我刚刚从詹金斯开始 我正在尝试在分支 主控上运行构建 我得到的只是没有安排分支的构建 master 这是日志 Started by timer Sun Mar 05 18 23 43 NPT 2017 Starting branch ind
  • Python Reportlab 中的动态帧大小

    我尝试生成一个发货清单报告实验室 questions tagged reportlab在Python中 我试图使用 Platypus 将所有部分 如发件人地址 收件人地址 表格 放在适当的位置Frames 第一个问题我遇到的问题是我需要很多
  • UICollectionView:不同大小的项目不会在重复使用的项目上计算

    我有一个包含不同项目大小的集合视图 我在其中声明 CGSize collectionView UICollectionView collectionView layout UICollectionViewLayout collectionV
  • 在 Perl 中使用引用指向滑动窗口数组

    这是我的问题 我有 2 个数组 一种是字符数组 代表滑动窗口 角色从开头移动并推到结尾 我想使用第二个数组来存储对数组切片的引用 这些数组切片 跟随 字符移动 例子 my char array h e l l o w o r l d my
  • 表达式树不能包含赋值运算符?

    如何增加 linq 语句中的索引值 int headIndex 1 int itemIndex 1 lst from xx in db vwCustomizationHeaders where xx ProductID pID select
  • Amazon CloudFront 与 S3 --> 按域限制访问?

    在 Amazon S3 上 您可以按域限制对存储桶的访问 但据我从一位有用的 StackOverflow 用户那里了解到 您无法在 CloudFront 上执行此操作 但为什么 如果我是正确的 CloudFront 只允许基于时间的限制或
  • 使用d3.js实现元素的过渡效果

    我正在将一个元素从一个点移动到另一个点 但具体来说我想实现这个动画 http carto net svg samples path animation svg http carto net svg samples path animatio
  • Android WorkManager Worker 无法使用 Dagger Hilt `@WorkerInject` 注入

    我正在尝试遵循以下指南https developer android com training dependency injection hilt jetpack workmanager https developer android co
  • 在 Sybase ASE 中更新插入(更新或插入)?

    我正在编写一个应用程序 将数据从 Oracle 移动到 Sybase 并且需要执行更新 插入操作 在 Oracle 中 我会使用 MERGE INTO 但它似乎在 Sybase 中不可用 无论如何 在 ASE 中也不可用 我知道这可以通过多
  • 为什么 ASP.NET Dynamic 控件即使添加到 Page_Load 中也能保留 ViewState?

    我做了一些与动态控件和 ViewState 相关的研究 我读到 为了保留动态控件的 ViewState 您必须将其添加到 Page Init 事件中 这是有道理的 因为 PageLifeCycle 是 初始化 加载视图状态 加载回发数据 L
  • dynamoDB 如何存储数据?

    由于Dynamodb以键值对的形式存储数据 其中键是主键的类型 值是与其关联的数据 我想知道dynamo db是否真正理解值 json 我所说的值是指json与键关联的对象 RDBMS 中的一行 dynamo db 是否理解有一些属性以及它
  • 如何在现有高流量网站上进行facebook审核流程?

    I have 已经实现 Facebook 登录 注册在网站上 使用 Javascript 和 PHP SDK 的组合 我记得审核过程大约花了一两天的时间 那是一个全新的网站 现在 我需要将相同的功能添加到另一个现有的且目前每天有数百名访问者
  • 如何使用 devtoolset-8-gcc 安装 gcc8

    我使用的是 CentOS Linux 版本 7 3 1611 其中安装了 gcc 4 8 5 20150623 我正在寻找一种安装较新版本的 gcc 的方法 特别是 8 1 我找到了以下关于如何安装 gcc v7 的网站link 1 htt
  • 结合使用 `mutate_at` 和 `na_if` 仅将某些列的零替换为 NA

    我的数据采用以下格式 library tidyverse df lt mtcars df lt df gt mutate vs doubled vs 2 gt select mpg cyl vs am vs doubled head df
  • Socket ReceiveAsync 合并数据包

    我打算通过套接字接收数据包 但由于它们是从发送方以高频率发送的 因此其中许多数据包被打包成一个byte array SocketAsyncEventArgs Buffer然后保存多个数据包 即使它们是单独发送的 使用验证wireshark
  • TypeScript + React:强制该组件返回另一种类型的组件

    假设您有一个名为的通用组件
  • 将参数传递给注册策略

    我正在注册策略的帮助下使用社交身份提供商创建 B2C 用户 但我们需要向这个新用户添加一些用户属性 扩展属性 例如为用户设置 AccountId 如果我添加 AccountId 作为注册属性并输入一些值 它工作正常 当我通过图形 API 检