如何解决撤消Azure AD B2c用户的登录会话不适用于本机应用程序
我有一个具有移动(Android和Ios)和Web UI(SPA)的解决方案,它们都与常见的api对话。 我们正在使用AD B2C对用户进行身份验证。我们有一个业务需求,系统管理员需要删除用户。我们正在使用图api删除后端服务中的用户。这是分两个步骤完成的。
1) revoke the sign in session to kill the active sessions. Document(https://docs.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.
一旦访问令牌的生存期到期,则已删除的用户将从Web ui(SPA)中注销,而不是从移动应用程序中注销。
对于移动应用程序,我们使用MSALandroid 0.2.2,对于SPA,我们使用MSAL angular 0.1.4。 还尝试过在ad b2c中为移动和网络应用程序配置单个和两个不同的应用程序。
我缺少任何移动应用程序吗?如何也撤消移动应用中的会话?
解决方法
为了使用户令牌无效,您需要执行以下操作:
-
对用户调用“无效的刷新令牌”自定义操作。对此端点的调用将“ refreshTokensValidFromDateTime”属性更新为dateTimeNow(UTC)
-
更新您的自定义策略,以在使用刷新令牌获取新的access / idToken时查看此字段
这些更改检查“ refreshTokensValidFromDateTime”是否比refreshToken发布的时间新。如果是,则意味着旧的刷新令牌已失效。
要使用户的刷新令牌无效,您需要在图形中调用此端点
https://graph.windows.net/contoso.onmicrosoft.com/users/3ff8bee2-d1dc-445a-bca1-64101d478f43/invalidateAllRefreshTokens?api-version=1.6
时钟偏斜
在创建刷新令牌的服务器(Azure AD B2C服务)与在用户对象上标记refreshTokenValidFromDateTime
值的服务器(Graph服务)之间存在时钟偏移,以解决观察到的时间上的潜在差异。当前设置为300000毫秒(或5分钟)
要解决时钟偏斜问题,您可以更新ClaimsTransformtion = AssertRefreshTokenIssuedLaterThanValidFromDate
这个值
<InputParameter Id="TreatAsEqualIfWithinMillseconds" DataType="int" Value="10000" />
刷新令牌无效可以被应用程序称为即席(adhoc),或者您可以在密码重置过程中编写一个调用图的API,或者在需要时按需调用它。在这种情况下,经历密码重置过程的用户将看到他们的会话已结束,并且将在所有其他设备上提示该用户。
需要更改
对于自定义策略,需要添加以下技术资料(TP),声明转换(CT)和声明提供者(CP),以便该策略检查刷新令牌是否无效。
<ClaimsTransformation Id="AssertRefreshTokenIssuedLaterThanValidFromDate" TransformationMethod="AssertDateTimeIsGreaterThan">
<InputClaims>
<InputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" TransformationClaimType="leftOperand" />
<InputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" TransformationClaimType="rightOperand" />
</InputClaims>
<InputParameters>
<InputParameter Id="AssertIfEqualTo" DataType="boolean" Value="false" />
<InputParameter Id="AssertIfRightOperandIsNotPresent" DataType="boolean" Value="true" />
<InputParameter Id="TreatAsEqualIfWithinMillseconds" DataType="int" Value="10000" />
</InputParameters>
</ClaimsTransformation>
...
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="JwtIssuer">
<DisplayName>JWT Issuer</DisplayName>
<Protocol Name="None" />
<OutputTokenFormat>JWT</OutputTokenFormat>
<Metadata>
<Item Key="client_id">{service:te}</Item>
<Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
<Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
<Item Key="RefreshTokenUserJourneyId">RedeemRefreshTokenV1</Item>
</Metadata>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
<Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer" />
</CryptographicKeys>
<InputClaims />
<OutputClaims />
</TechnicalProfile>
...
<TechnicalProfile Id="TpEngine_RefreshTokenReadAndSetup">
<DisplayName>Trustframework Policy Engine Refresh Token Setup Technical Profile</DisplayName>
<Protocol Name="None" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId" />
<OutputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" />
</OutputClaims>
</TechnicalProfile>
</TechnicalProfiles>
...
<TechnicalProfile Id="AAD-UserReadUsingObjectId-CheckRefreshTokenDate">
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="AssertRefreshTokenIssuedLaterThanValidFromDate" />
</OutputClaimsTransformations>
<IncludeTechnicalProfile ReferenceId="AAD-UserReadUsingObjectId" />
</TechnicalProfile>
...
<UserJourney Id="RedeemRefreshTokenV1">
<AssuranceLevel>LOA1</AssuranceLevel>
<PreserveOriginalAssertion>false</PreserveOriginalAssertion>
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="RefreshTokenSetupExchange" TechnicalProfileReferenceId="TpEngine_RefreshTokenReadAndSetup" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
使用“刷新令牌”时将调用此旅程,并实际上检查在Graph API调用中更新的refreshTokenLastValidFrom
时间戳。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。