如何在 AAD B2C 中添加 Slack 作为标识提供者?



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

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

这是我现在在声明提供程序中使用的技术配置文件。我有另一个用于 AAD 多租户的声明提供程序。根本没有修改 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,但随后我得到了一个异常。将策略置于开发模式以将日志放入应用见解,并收到异常,指出:收到无效的 OAuth 响应:"{0}"。 "消息":"字典中不存在给定的键","数据":{}

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

  1. 使用你的帐户凭据登录到 Slack API。
  2. 选择">创建新应用"。
  3. 输入应用名称,然后选择开发可宽延工作区
  4. 选择"创建应用"。
  5. 在">应用凭据">下,复制"客户端ID"和"客户端密码"的值。你将需要它们来将 Slack 配置为租户中的标识提供者。客户端密码是重要的安全凭据。
  6. "功能">下,选择"OAuth 和权限"。
  7. 添加新的重定向 URL,输入https:/your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/oauth2/authresp。 将租户名称替换为租户的名称。输入租户名称时,即使租户在 Azure AD B2C 中使用大写字母定义,也需要使用全部小写字母。
  8. 点击保存网址

创建策略密钥

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

  1. 登录到 Azure 门户。
  2. 确保使用的是包含 Azure AD B2C 租户的目录,方法是单击顶部菜单中的"目录和订阅筛选器"并选择包含租户的目录。
  3. 选择 Azure 门户左上角的">所有服务",然后搜索并选择">Azure AD B2C"。
  4. 在"概述"页上,选择">标识体验框架 - 预览版"。
  5. 选择">策略密钥",然后选择">添加"。
  6. 对于选项,选择Manual
  7. 输入策略密钥的名称。例如,SlackSecret.前缀B2C_1A_会自动添加到密钥名称中。
  8. "机密">中,输入之前记录的客户端机密。
  9. 对于"密钥用法",请选择"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

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

最新更新