- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已按照 B2C tutorial docs 为应用程序创建了策略。它成功在 B2C 租户中创建用户,填写来自任何/所有发行者的名字..电子邮件等 - 目前,其他任何 Azure 租户都可以登录到此 B2C 租户,这是必需的。
但是,如果原始发行人的对象的详细信息发生变化(例如名称更改)怎么办?目前,除非用户按照流程(手动)编辑自己的个人资料,否则会出现不匹配的情况。
是否可以创建一个旅程,在对象存在于 B2C 租户中之后向发行者请求 claim ,然后使用新的详细信息更新本地用户?
我希望实现的结果是,如果在 B2C 用户进行身份验证时原始帐户已以某种方式进行了编辑,则自动更新 B2C 租户用户。这样,链接到 B2C 租户的应用程序就可以发送更新的声明。
我理解这个前提,但我缺乏的是关于我在旅程中需要哪些步骤以及这些步骤是什么样子的知识。如果有人可以分享一个示例,甚至只是从原始发行者处读取名称并将其复制到 B2C 租户用户,那么这对我来说将非常有用。
[编辑]感谢Jas提供详细的解决方案!我通过简单地将 AAD-UserReadUsingObjectId 和 AAD-UserWriteUsingAlternativeSecurityId 步骤添加到注册登录旅程的末尾来解决此问题。每次登录时,它都会使用原始对象的声明更新 B2C 用户对象,并且满足要求,因为它更新了 B2C 租户并将更新后的属性传递给也需要它们的应用程序。
最佳答案
OpenId technical profile 中的输出声明允许您将从 IdP 传入的声明映射到 AAD B2C 声明包中。
让我们使用监视 IdP 上的 displayName 是否已更改的示例。
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="live.com" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
<OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="sub" />
<OutputClaim ClaimTypeReferenceId="displayNameFromIdp" PartnerClaimType="name" />
<OutputClaim ClaimTypeReferenceId="email" />
</OutputClaims>
然后我们使用 AAD-ReadUsingAlternativeSecurityId 读取用户, 默认情况下。请参阅此处的输出声明,如下所示,这将读取 B2C 目录中已存在的用户的 displayName。
<OutputClaims>
<!-- Required claims -->
<OutputClaim ClaimTypeReferenceId="objectId" />
<!-- Optional claims -->
<OutputClaim ClaimTypeReferenceId="userPrincipalName" />
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="otherMails" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="identityChanged" DefaultValue="false"/>
</OutputClaims>
现在,我们使用 CompareClaims claim transform 比较 displayName
和 displayNameFromIdp
值。 .
<ClaimsTransformation Id="CompareDisplayName" TransformationMethod="CompareClaims">
<InputClaims>
<InputClaim ClaimTypeReferenceId="displayNameFromIdp" TransformationClaimType="inputClaim1" />
<InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim2" />
</InputClaims>
<InputParameters>
<InputParameter Id="operator" DataType="string" Value="NOT EQUAL" />
<InputParameter Id="ignoreCase" DataType="boolean" Value="true" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityChanged" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
为您要检查的每个声明进行如下声明转换。仅更改 inputClaims
,因此如果有任何更改,它始终会在 identityChanged
声明中反射(reflect)为 bool 值。
将此 ClaimTransform 作为输出声明转换添加到 AAD-ReadUsingAlternativeSecurityId
:
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CompareDisplayName" />
</OutputClaimsTransformations>
对于您创建的每个声明转换,对于您想要保持同步的每个属性,添加引用声明转换 ID 的输出声明转换。
现在,如果 identityChanged
== true
,我们就知道调用 AAD Write 技术配置文件。在您的旅程中,在 AAD-UserReadUsingAlternativeSecurityId
之后(读取用户之后)和 AAD-UserWriteUsingAlternativeSecurityId
(创建用户之后)之后的某个时刻添加一个步骤。 p>
<OrchestrationStep Order="NUMBER" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>identityChanged</Value>
<Value>false</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="AADUserUpdate" TechnicalProfileReferenceId="AAD-UserUpdateUsingAlternativeSecurityId" />
</ClaimsExchanges>
</OrchestrationStep>
定义 Azure AD technical profile更新用户:
<TechnicalProfile Id="AAD-UserUpdateUsingAlternativeSecurityId">
<Metadata>
<Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">false</Item>
</Metadata>
<PersistedClaims>
<PersistedClaim ClaimTypeReferenceId="alternativeSecurityId" />
</PersistedClaims>
<IncludeTechnicalProfile ReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
定义声明identityChanged
和displayNameFromIdp
:
<ClaimType Id="identityChanged">
<DisplayName>identityChanged</DisplayName>
<DataType>boolean</DataType>
</ClaimType>
<ClaimType Id="displayNameFromIdp">
<DisplayName>displayNameFromIdp</DisplayName>
<DataType>string</DataType>
</ClaimType>
关于azure - 是否可以使用身份体验框架通过使用发行人的声明来自动更新 B2C 用户详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71831955/
有没有人有跨平台移动应用程序开发框架的经验MoSync ? 听起来不错,很有前途。但它能实现吗? 最佳答案 我们已经使用 MoSync 8 个月了,我对它的感觉很好。对我来说,您使用 C++ 编写代码
我可以相信,我可以使用 HTML5、CSS3 和 JavaScript 开发应用程序,然后使用适用于 Android、iOS 和 Win Phone 7 的 PhoneGap 对其进行编译吗? 这个有
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos 关于虚拟线程
Xedit 是 X11 图形服务器的一部分,它不算好看,但却有足够的隐藏功能,使它成为一个严肃的文本编辑器。 X11 图形服务器由 X.org 发布,它有一些象征性的应用来展示
我一直致力于让使用屏幕阅读器的用户可以访问 Web 内容。对于像我这样的新手,您可以想象我从 Mac -> Windows 或浏览器 -> 浏览器到现在的屏幕阅读器 -> 屏幕阅读器遇到的挫败感。 我
我们希望通过网络共享 AR 体验 (ARWorldMap)(不一定是附近的设备,我指的是可以存储到某个服务器然后由其他用户检索的数据)。 现在我们正在调查 ARWorldMap这非常棒,但我认为它只适
人们可能会认为将 3 个字符的缩写转换为数字表示形式是一项简单的任务。 JavaScript 说“不!”。 $(selector).each(function() { // convert m
我有一堆盒子可以像这样在旋转木马中滑动: 这是我的 div 的结构: 1 2 3 4 5 6 当我的页面加载时,我无法向左滚动,所以我想将向左的箭头
我即将开始一个新的移动应用程序项目,我在 iOS 或 Android 开发方面没有太多经验,但我在不同场合使用 Vaadin 进行演示层。 该应用程序对于移动客户端很可能是轻量级的,但对于后端服务器(
我有兴趣实现分页 UIScrollView 体验,与当前的 Twitter 应用程序非常相似,其中在 View 层次结构的顶部有一个主分页 UIScrollView(水平滚动),以及其他几个(垂直滚动
我想使用一些具有良好性能结果的 .NET IoC 容器。我读了this article关于 IoC 容器性能,DryIoc 和 LightInject 似乎是最好的。但是我没有找到关于它们的一些评论,
我正在为一个重要项目寻找新的 ORM,我习惯于使用 ActiveRecord 进行 nHibernate,并且我已经对 EF4、性能和崩溃的 GUI 有了非常糟糕的体验。 所以在网上搜索我找到了 Su
我们(一个大约 150 人的团队)正在考虑将我们的 ALM 解决方案从 Bugzilla/CVS 迁移到 Jira/svn/Confluence/Bamboo/Fisheye。 SO 有很多关于这些的
为网站创建丰富的 AJAX 体验,类似于 http://www.pageflakes.com/动态加载不同的内容区域,我正在考虑使用 JQuery 来做到这一点,使用 load 方法动态加载页面的特定
我想做一些分布式计算。使用 GPU 进行机器学习?只是想知道是否有人有使用 MXNET 的经验(perf. vs Theano) 引用资料 http://www.cs.cmu.edu/~muli/fi
苹果终于推出了所谓的auto-renewable subscriptions昨天。由于我在应用内购买方面的经验很少(仅限沙盒),所以我不确定我在这里是否一切顺利。似乎需要对收据进行服务器端验证。找出订
我使用 Azure AD B2C 作为 Dynamics CRM 门户应用程序的身份验证解决方案。到目前为止,B2C 允许自定义注册体验,我已经这样做来自定义注册/登录页面的外观和感觉,但我没有看到任
目标:当我们在浏览器上滚动 youtube 时,整个页面向下滚动,我想创建两个滚动器: 留下一个用于视频和评论滚动。 右边的一个用于下一个(推荐的视频)滚动。 我发现我们可以使用 overflow:
在SFSafariViewController描述是这样写的 您将使用 SFAuthenticationSession 的两种情况是: Logging in to a third party's se
你好,我需要在像 这样的聊天屏幕中开发像 whats app 这样的布局在此我想在聊天 TextView 完成后显示时间。 我已经做到了
我是一名优秀的程序员,十分优秀!