Nav*_*thi 5 azure-active-directory azure-ad-graph-api azure-ad-b2c microsoft-graph-api
我有一个具有移动(android 和 Ios)和 Web UI(SPA)的解决方案,两者都与常见的 api 通信。我们使用 AD B2C 来验证用户身份。我们有一个业务需求,系统管理员删除用户。我们正在使用图形 API 来删除后端服务中的用户。这是分两步完成的。
1) revoke the sign in session to kill the active sessions. Document(https://learn.microsoft.com/en-us/graph/api/user-revokesigninsessions?view=graph-rest-1.0&tabs=http)
2) Deleting the user account from b2c using graph api.
Run Code Online (Sandbox Code Playgroud)
一旦 accesstoken 的生命周期到期,已删除的用户将从 Web ui (SPA) 中注销,但不会从移动应用程序中注销。
对于移动应用程序,我们使用 MSALandroid 0.2.2;对于 SPA,我们使用 MSAL Angular 0.1.4。还尝试在 ad b2c 中为移动和 Web 应用程序配置单个和两个不同的应用程序。
我是否缺少任何移动应用程序?如何从移动应用程序撤销会话?
为了使用户令牌无效,您需要执行以下操作:
\n对用户调用“使刷新令牌无效”自定义操作。对此端点的调用会将“refreshTokensValidFromDateTime”属性更新为 dateTimeNow(UTC)
\n更新您的自定义策略以在使用刷新令牌获取新的 access/idToken 时查看此字段
\n这些更改检查“refreshTokensValidFromDateTime”是否比颁发的刷新令牌更新。如果是,则意味着旧的刷新令牌已失效。
\n要使用户的刷新令牌无效,您需要在图中调用此端点\n https://graph.windows.net/contoso.onmicrosoft.com/users/3ff8bee2-d1dc-445a-bca1-64101d478f43/invalidateAllRefreshTokens?api-version=1.6\n\xc2\xa0
时钟偏差
\n存在时钟偏差,以解释创建刷新令牌的服务器(Azure AD B2C 服务)和标记刷新令牌的服务器之间观察到的时间的潜在差异。refreshTokenValidFromDateTime在用户对象上标记值的服务器(图形服务)之间观察到的时间的潜在差异。目前设置为 300000 毫秒(或 5 分钟)
要考虑时钟偏差,您可以使用ClaimsTransformtion = AssertRefreshTokenIssuedLaterThanValidFromDate此值更新\n
<InputParameter Id="TreatAsEqualIfWithinMillseconds" DataType="int" Value="10000" />\nRun Code Online (Sandbox Code Playgroud)\n刷新令牌失效可以由应用程序临时调用,或者您可以在密码重置过程中编写一个调用图形的 API,或者在需要时按需调用它。在这种情况下,经历密码重置过程的用户将看到其会话已结束,并且将在所有其他设备上提示用户。
\n需要改变
\n对于自定义策略,需要添加以下技术配置文件 (TP)、声明转换 (CT) 和声明提供者 (CP),以便策略检查刷新令牌是否无效。
\n<ClaimsTransformation Id="AssertRefreshTokenIssuedLaterThanValidFromDate" TransformationMethod="AssertDateTimeIsGreaterThan">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputClaims>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" TransformationClaimType="leftOperand" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" TransformationClaimType="rightOperand" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </InputClaims>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputParameters>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputParameter Id="AssertIfEqualTo" DataType="boolean" Value="false" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputParameter Id="AssertIfRightOperandIsNotPresent" DataType="boolean" Value="true" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputParameter Id="TreatAsEqualIfWithinMillseconds" DataType="int" Value="10000" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </InputParameters>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </ClaimsTransformation>\nRun Code Online (Sandbox Code Playgroud)\n...
\n\xc2\xa0\xc2\xa0\xc2\xa0 <ClaimsProvider>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <DisplayName>Token Issuer</DisplayName>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <TechnicalProfiles>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<TechnicalProfile Id="JwtIssuer">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <DisplayName>JWT Issuer</DisplayName>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <Protocol Name="None" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputTokenFormat>JWT</OutputTokenFormat>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <Metadata>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <Item Key="client_id">{service:te}</Item>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<Item Key="RefreshTokenUserJourneyId">RedeemRefreshTokenV1</Item>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </Metadata>\n <CryptographicKeys>\n <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />\n <Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer" />\n </CryptographicKeys>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <InputClaims />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaims />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </TechnicalProfile>\nRun Code Online (Sandbox Code Playgroud)\n...
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <TechnicalProfile Id="TpEngine_RefreshTokenReadAndSetup">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <DisplayName>Trustframework Policy Engine Refresh Token Setup Technical Profile</DisplayName>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <Protocol Name="None" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaims>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaim ClaimTypeReferenceId="objectId" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </OutputClaims>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </TechnicalProfile>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </TechnicalProfiles>\nRun Code Online (Sandbox Code Playgroud)\n...
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <TechnicalProfile Id="AAD-UserReadUsingObjectId-CheckRefreshTokenDate">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaims>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </OutputClaims>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaimsTransformations>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OutputClaimsTransformation ReferenceId="AssertRefreshTokenIssuedLaterThanValidFromDate" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </OutputClaimsTransformations>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <IncludeTechnicalProfile ReferenceId="AAD-UserReadUsingObjectId" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </TechnicalProfile>\nRun Code Online (Sandbox Code Playgroud)\n...
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<UserJourney Id="RedeemRefreshTokenV1">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <AssuranceLevel>LOA1</AssuranceLevel>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <PreserveOriginalAssertion>false</PreserveOriginalAssertion>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OrchestrationSteps>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OrchestrationStep Order="1" Type="ClaimsExchange">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <ClaimsExchanges>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <ClaimsExchange Id="RefreshTokenSetupExchange"\xc2\xa0TechnicalProfileReferenceId="TpEngine_RefreshTokenReadAndSetup"\xc2\xa0/>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </ClaimsExchanges>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </OrchestrationStep>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OrchestrationStep Order="2" Type="ClaimsExchange">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <ClaimsExchanges>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </ClaimsExchanges>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </OrchestrationStep>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 </OrchestrationSteps>\n\xc2\xa0\xc2\xa0\xc2\xa0 </UserJourney>\nRun Code Online (Sandbox Code Playgroud)\n使用刷新令牌时将调用此旅程,并实际检查refreshTokenLastValidFrom在图形 API 调用中更新的时间戳。
| 归档时间: |
|
| 查看次数: |
4458 次 |
| 最近记录: |