2017-12-09 5 views
0

Ich richte GitHub als benutzerdefinierten Anbieter in Azure AD B2C mit benutzerdefinierten Richtlinien ein. Ich bin in der Lage, auf die Anmeldeseite zu gelangen und erfolgreich zum korrekten Azure-Anzeigenlink weiterzuleiten, aber ein Serverfehler in Azure AD B2C weist den zweiten Teil von OAUTH immer zurück.Azure AD B2C - Benutzerdefinierter Provider für GitHub kann nicht auf Token zugreifen

Wenn ich die Trace-Logs der App insights ansehe, wird die Meldung "Eine ungültige OAuth-Antwort wurde empfangen" und "Unerwartetes Zeichen beim Parsen des Werts: a" gefunden. Hier ist die Politik Provider I ein:

<ClaimsProvider> 
     <Domain>github.com</Domain> 
     <DisplayName>GitHub</DisplayName> 
     <TechnicalProfiles> 
     <TechnicalProfile Id="GitHub-OAUTH"> 
      <DisplayName>GitHub</DisplayName> 
      <Protocol Name="OAuth2" /> 
      <Metadata> 
      <Item Key="ProviderName">github</Item> 
      <Item Key="authorization_endpoint">https://github.com/login/oauth/authorize</Item> 
      <Item Key="AccessTokenEndpoint">https://github.com/login/oauth/access_token?</Item> 
      <Item Key="HttpBinding">POST</Item> 
      <Item Key="ClaimsEndpoint">https://api.github.com/user</Item> 
      <Item Key="client_id">My Client Id</Item> 
      <Item Key="UsePolicyInRedirectUri">0</Item> 
      <Item Key="scope">user</Item> 
      <Item Key="response_types">code</Item> 
      </Metadata> 
      <CryptographicKeys> 
      <Key Id="client_secret" StorageReferenceId="B2C_1A_GitHubSecret" /> 
      </CryptographicKeys> 
      <OutputClaims> 
      <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="id" /> 
      <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" /> 
      <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> 
      <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="github.com" /> 
      <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" /> 
      </OutputClaims> 
      <OutputClaimsTransformations> 
      <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" /> 
      <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" /> 
      <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" /> 
      </OutputClaimsTransformations> 
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" /> 
     </TechnicalProfile> 
     </TechnicalProfiles> 
    </ClaimsProvider> 

Ich frage mich, ob das Problem ist, dass der access_token nicht in einem json zurückgegeben wird? Ich trat durch alle Schritte selbst in Postbote und der Code wurde als URL-Parameter zurückgegeben, und die access_token wurde in den Körper der Antwort wie folgt zurückgegeben:

access_token=<snip>&scope=user%3Aemail&token_type=bearer 

Bin ich ein Metadatenelement fehlt in der benutzerdefinierter Anbieter zur Unterstützung dieser Antwort? Oder funktioniert das einfach nicht in Azure AD B2C?

Antwort

0

Ja, das liegt daran, dass die Zugriffstokenantwort als HTML-Formular codiert ist und nicht als JSON.

Im Folgenden wird beschrieben, wie Sie GitHub integrieren können.

1) Hinzufügen eines Anspruchstyp für die GitHub Benutzerkennung vom Typ long:

<ClaimType Id="gitHubUserId"> 
    <DisplayName>GitHub User ID</DisplayName> 
    <DataType>long</DataType> 
</ClaimType> 

2) In eine Transformation Ansprüche vom GitHub Benutzerkennung vom Typ Umwandlung long zum Azure AD B2C sozialen Benutzeridentifikator string vom Typ:

<ClaimsTransformation Id="CreateAlternativeSecurityUserIdForGitHub" TransformationMethod="ConvertNumberToStringClaim"> 
    <InputClaims> 
    <InputClaim ClaimTypeReferenceId="gitHubUserId" TransformationClaimType="inputClaim" /> 
    </InputClaims> 
    <InputParameters> 
    <InputParameter Id="stringFormat" DataType="string" Value="{0}" /> 
    </InputParameters> 
    <OutputClaims> 
    <OutputClaim ClaimTypeReferenceId="socialIdpUserId" TransformationClaimType="outputClaim" /> 
    </OutputClaims> 
</ClaimsTransformation> 

3) Fügen Sie das technische Profil für den GitHub OAuth Flow:

<TechnicalProfile Id="GitHub-OAUTH"> 
    <DisplayName>GitHub</DisplayName> 
    <Protocol Name="OAuth2" /> 
    <Metadata> 
    <Item Key="ProviderName">github.com</Item> 
    <Item Key="authorization_endpoint">https://github.com/login/oauth/authorize</Item> 
    <Item Key="AccessTokenEndpoint">https://github.com/login/oauth/access_token</Item> 
    <Item Key="HttpBinding">GET</Item> 
    <Item Key="ClaimsEndpoint">https://api.github.com/user</Item> 
    <Item Key="client_id">Insert the client identifier</Item> 
    <Item Key="scope">user</Item> 
    <Item Key="UserAgentForClaimsExchange">CPIM-Basic/{tenant}/{policy}</Item> 
    </Metadata> 
    <CryptographicKeys> 
    <Key Id="client_secret" StorageReferenceId="B2C_1A_GitHubSecret" /> 
    </CryptographicKeys> 
    <OutputClaims> 
    <OutputClaim ClaimTypeReferenceId="gitHubUserId" PartnerClaimType="id" /> 
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" /> 
    <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> 
    <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" /> 
    <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="github.com" /> 
    </OutputClaims> 
    <OutputClaimsTransformations> 
    <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" /> 
    <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" /> 
    <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityUserIdForGitHub" /> 
    <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" /> 
    </OutputClaimsTransformations> 
    <UseTechnicalProfileForSessionManagement ReferenceId="SSOSession-Noop" /> 
</TechnicalProfile> 
+0

Chris, danke für die Antwort! Ich kann in App-Insights sehen, dass die Anspruchsantwort von GitHub zurückkommt, aber es gibt immer noch einen internen Serverfehler während der ValidateApiResponseHandler-Phase (und geht dann zu NoOpHandler, bevor der Fehler zurückgegeben wird): "Ein selbstgewählter Sendevorgang Antwort ist fehlgeschlagen mit Grund 'Interner Serverfehler'. " Ich legte den ursprünglichen Richtliniennamen in das Feld UserAgentForClaimsExchange: CPIM-Basic//B2C_1A_signup_signin. Ist das die richtige Richtlinie? –

+0

Was bedeutet UserAgentForClaimsExchange? –

+0

Sie sollten keine der {mandator} - oder {policy} -Token ersetzen. Die Azure AD B2C-Engine ersetzt sie. –