Azure AD B2C - 联合 SAML IDP 启动登录

问题描述 投票:0回答:1

我已将我们的 Web 应用程序配置为通过 OIDC 使用 Azure AD B2C,该应用程序可以成功地与内置 IDP 集成(如 Github 或本地帐户)配合使用。我们收到客户请求,将他们的 SAML IDP 集成到我们的 B2C 租户中。在 B2C 中使用自定义策略,这对于将用户从 Web 应用程序发送到 B2C,然后发送到 SAML IDP 非常有效。

但是,新请求是针对 IDP 发起的登录,其中 IDP 向我们发送 SAML 断言以自动登录用户。到目前为止,我们的努力已导致用户通过 SAML 断言重定向回 B2C,但是B2C无法再进一步。最终,我们需要将此 SAML 断言转换为 OIDC 令牌,该令牌可以发送回我们的 Web 应用程序以处理用户流的最后部分。根据 SO 社区之前的答案和 B2C 文章,B2C 中似乎不支持此功能。

我的问题是:

  • 其他企业肯定也遇到过这种需求,因为 IDP 发起的登录是 SAML 标准的一部分。他们是怎么解决的?
  • 我们尝试的解决方案是否有效,或者我们是否应该考虑从我们的基础设施中删除 B2C?有替代方案吗?
  • 是否可以将我们的 Web 应用程序配置为支持 SAML 和 OIDC?我在here找到了此选项的潜在参考。

这是我们在尝试处理 SAML 断言时从 Azure AD B2C 收到的错误消息:

租户“*****.onmicrosoft.com”中的策略“B2C_1A_MockSAMLSOO”没有受支持的依赖方协议

这是我们当前的依赖方:

<RelyingParty>
  <DefaultUserJourney ReferenceId="CustomSignUpOrSignIn" />
  <Endpoints>
    <!--points to refresh token journey when app makes refresh token request-->
    <Endpoint Id="Token" UserJourneyReferenceId="RedeemRefreshToken" />
  </Endpoints>
  <TechnicalProfile Id="PolicyProfile">
    <DisplayName>PolicyProfile</DisplayName>
    <Protocol Name="OpenIdConnect" />
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
      <OutputClaim ClaimTypeReferenceId="givenName" />
      <OutputClaim ClaimTypeReferenceId="surname" />
      <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="emails" />
      <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
      <OutputClaim ClaimTypeReferenceId="identityProvider" />
      <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />

    </OutputClaims>
    <SubjectNamingInfo ClaimType="sub" />
  </TechnicalProfile>
</RelyingParty>
azure-active-directory azure-ad-b2c openid-connect saml-2.0 azure-ad-b2c-custom-policy
1个回答
0
投票

OIDC 标准不支持 IDP 发起的流,如此答案中所述。当使用 IDP 发起时,客户端和 OIDC 提供商都无法轻松确定用户发起的流程,或检测响应是否是未经请求的。

如今,建议合作伙伴不要使用 IDP 启动,而是为 OIDC 安全应用程序的链接添加书签,并提供提示以告诉应用程序使用 SAML IDP 作为其身份验证流程的一部分。当应用程序运行其(SP 启动的)OIDC 代码流时,它可以使用

acr_values
idp
等参数来确保使用 SAML IDP。

https://www.example.com?acr_values=saml_partner1_idp

OAuth 和 OIDC 倾向于为应用程序提供“最新标准”,因此,如果可以的话,我的目标是避免将 SAML 集成到应用程序中。相反,OIDC 提供商应该为您启动所有形式的身份验证,然后向应用程序颁发一致的令牌。

如何进行?

该需求可能来自客户的 IT 部门,基于它们与其他应用程序的链接方式,而不是具有商业价值的需求。我的目标是说服他们根据标准添加不同的 URL 书签,并在使用最新的安全标准时为其数据提供最佳的安全性。

战术解决方案

任何 OIDC 编码解决方案的问题在于,它可能会降低应用程序的安全性,或增加技术成本。如果我必须实现这样的解决方案,我会研究 OIDC 提供商的可扩展性/插件模型。

我的目标是遵循随机数模式,其中 OIDC 提供商接收 IDP 发起的 SAML 响应并将数据存储在随机数表中。然后它会返回一个短暂且不可猜测的数字,该数字只能使用一次给应用程序:

https://www.example.com?nonce=OFiicYQJYY2phWnD5nFMflid5Du82ycW

然后,应用程序可以启动 OIDC 术语中尽可能标准的代码流,因此应用程序应该继续在 PEN 测试中表现良好。此请求将使用自定义身份验证方法,在随机数表中查找随机数及其过期时间。如果有效,则将在 SAML 断言中为用户创建 OAuth 委托,并以标准方式向应用程序颁发令牌。

https://login.example.com/oauth/authorize ?client_id=web-client &redirect_uri=https://www.example.com &response_type=code &code_challenge=l9QIPE4TFgW2y7STZDSWQ4Y4CQp &code_challenge_method=S256 &state=NlAoISfdL1DxPdNGFBljlVuB &scope=openid%20profile &login_hint_token=OFiicYQJYY2phWnD5nFMflid5Du82ycW &acr_values=nonce_authentication &prompt=login

© www.soinside.com 2019 - 2024. All rights reserved.