如何在 AAD B2C 中添加 Slack 作为身份提供者?

How to add Slack as an Identity Provider in AAD B2C?

我想使用 AAD B2C 将 Slack 作为身份提供者添加到我的应用程序中。有没有关于如何为此构建技术配置文件的示例?

我能够创建连接到 Slack 的技术配置文件,但我在发送 user_scope 参数而不是范围参数时遇到问题。 OAuth2 技术配置文件仅支持“范围”参数,我无法找到发送“user_scope”的方法。 我也能够使用其中不包含“v2”的端点进行连接,但我不确定这是正确的方法

这是我现在在 ClaimsProvider 中使用的技术配置文件。我有另一个用于 AAD 多租户的 ClaimsProvider。完全没有为 Slack 修改依赖方。

    <TechnicalProfile Id="Slack-OAUTH">
      <DisplayName>Slack</DisplayName>
      <Protocol Name="OAuth2" />
      <Metadata>
        <Item Key="ProviderName">slack</Item>
        <Item Key="authorization_endpoint">https://slack.com/oauth/v2/authorize</Item>
        <Item Key="AccessTokenEndpoint">https://slack.com/api/oauth.v2.access</Item>
        <Item Key="ClaimsEndpoint">https://slack.com/api/users.identity</Item>
        <Item Key="HttpBinding">POST</Item>
        <Item Key="UsePolicyInRedirectUri">0</Item>
        <Item Key="client_id">ClientID</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="REFERENCE_TO_SECRET_IN_B2C_KEYS" />
      </CryptographicKeys>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="user_scope" DefaultValue="identity.basic" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="slack" />
        <OutputClaim ClaimTypeReferenceId="user" />
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="GetIdClaimFromJson" />
        <OutputClaimsTransformation ReferenceId="GetNameClaimFromJson" />
        <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
        <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
        <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId" />
      </OutputClaimsTransformations>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
    </TechnicalProfile>

对 slack 的调用有效,我得到了一个代码并被重定向到 aadb2c,但随后我得到了一个异常。将策略置于开发模式以将日志放入 App Insights 并收到异常消息:收到无效的 OAuth 响应:“{0}”。 'Message':'The given key was not present in the dictionary.','Data':{}

要从 Slack 帐户为用户启用登录,您需要创建一个 Slack 应用程序项目。

  1. 使用您的帐户凭据登录 Slack API
  2. Select 创建新应用.
  3. 输入一个应用名称和select一个Development Slack Workspace.
  4. Select 创建应用.
  5. App Credentials 下,复制 Client IDClient secret 的值。您将需要它们来将 Slack 配置为租户中的身份提供者。客户端密码是重要的安全凭证。
  6. 功能、select下OAuth 和权限
  7. 添加新的重定向URL,输入https:/your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/oauth2/authresp。 将 your-tenant-name 替换为您的租户名称。即使租户在 Azure AD B2C 中是用大写字母定义的,在输入租户名称时也需要全部使用小写字母。
  8. 单击保存URLs

创建策略密钥

您需要存储之前在 Azure AD B2C 租户中记录的客户端密码。

  1. 登录Azure portal
  2. 通过单击顶部菜单中的目录和订阅过滤器并选择包含您的租户的目录,确保您使用的是包含您的 Azure AD B2C 租户的目录。
  3. 选择 Azure 门户左上角的所有服务,然后搜索 select Azure AD B2C.
  4. 在概述页面上,select 身份体验框架 - 预览
  5. Select 策略密钥 然后 select 添加.
  6. 对于选项,选择Manual
  7. 为策略密钥输入 名称。例如,SlackSecret。前缀 B2C_1A_ 会自动添加到您的密钥名称中。
  8. Secret 中,输入您之前记录的客户端密码。
  9. 对于密钥用法, select Signature.
  10. 单击创建

Slack 声明提供者如下:

    <TechnicalProfile Id="Slack-OAUTH">
    <DisplayName>Log in with your Slack account</DisplayName>
    <Protocol Name="OAuth2"/>
    <OutputTokenFormat>JWT</OutputTokenFormat>
    <Metadata>
        <Item Key="AccessTokenEndpoint">https://slack.com/api/oauth.access</Item>
        <Item Key="authorization_endpoint">https://slack.com/oauth/authorize</Item>
        <Item Key="BearerTokenTransmissionMethod">AuthorizationHeader</Item>
        <Item Key="ClaimsEndpoint">https://slack.com/api/users.identity</Item>
        <Item Key="client_id">Your Slack App Registration Client ID</Item>
        <Item Key="HttpBinding">POST</Item>
        <Item Key="response_types">code</Item>
        <Item Key="scope">identity.basic</Item>
        <Item Key="UsePolicyInRedirectUri">false</Item>
    </Metadata>
    <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="B2C_1A_slackfederation"/>
    </CryptographicKeys>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="slackAuthentication" />
        <OutputClaim ClaimTypeReferenceId="user" />
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="slack" />
    </OutputClaims>
    <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="GetIdClaimFromJson" />
        <OutputClaimsTransformation ReferenceId="GetNameClaimFromJson" />
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
        <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
        <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
    </OutputClaimsTransformations>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>

支持声明转换:

    <ClaimsTransformation Id="GetIdClaimFromJson" TransformationMethod="GetClaimFromJson">
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="slackOAuthResponse" TransformationClaimType="inputJson" />
    </InputClaims>
    <InputParameters>
        <InputParameter Id="claimToExtract" DataType="string" Value="id" />
    </InputParameters>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" TransformationClaimType="extractedClaim" />
    </OutputClaims>
    </ClaimsTransformation>

    <ClaimsTransformation Id="GetNameClaimFromJson" TransformationMethod="GetClaimFromJson">
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="slackOAuthResponse" TransformationClaimType="inputJson" />
    </InputClaims>
    <InputParameters>
        <InputParameter Id="claimToExtract" DataType="string" Value="name" />
    </InputParameters>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="extractedClaim" />
    </OutputClaims>
    </ClaimsTransformation>

我一直在为同样的情况苦苦挣扎,其中 user_scope 在我的 .net 核心 Web 应用程序中不是有效参数。

我尝试将身份验证端点设置为:

https://slack.com/oauth/v2/authorize?user_scope=identity.basic+identity.email+identity.team

确实克服了一个障碍,但在我登录并重定向回我的网络应用程序后,它无法处理索赔。如果可以的话,我会更新这个部分答案,但希望它能帮助别人解决这个问题。