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

时间:2020-06-29 21:16:37

标签: azure-ad-b2c slack

我想使用AAD B2C将Slack作为身份提供者添加到我的应用程序中。是否有任何有关如何为此建立技术资料的示例?

我能够创建一个技术资料来连接到Slack,但是我在发送user_scope参数而不是scope参数时遇到了问题。 OAuth2技术资料仅支持“ scope”参数,而我找不到发送“ user_scope”的方法。 我还可以使用不包含“ v2”的端点进行连接,但是我不确定这是正确的方法

这是我现在在ClaimsProvider中使用的技术资料。我有针对AAD多租户的anos 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}'。 '消息':'字典中不存在给定的键。','数据':{}

2 个答案:

答案 0 :(得分: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 portal
  2. 通过单击顶部菜单中的目录和订阅筛选器,然后选择包含租户的目录,确保使用包含Azure AD B2C租户的目录。
  3. 在Azure门户的左上角选择所有服务,然后搜索并选择 Azure AD B2C
  4. 在“概述”页面上,选择身份体验框架-PREVIEW
  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>

答案 1 :(得分:0)

我一直在为user_scope在.net核心Web应用程序中不是有效参数而遇到这种情况。

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

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

确实超过了一个障碍,但是当我登录并重定向回我的Web应用程序后,它无法处理索赔。如果可以解决,我会更新此部分答案,但希望它将帮助某人解决这个问题。