2017-10-05 6 views
0

Active Directory B2C custom policy starter pack for social and local accounts의 예를 기반으로 소셜 계정과 로컬 계정에 대한 사용자 지정 정책을 만들었습니다. 저는 Microsoft와 Google의 로그인을 활성화했으며 두 가지가 모두 작동하는지 테스트했으며 로컬 계정으로 로그인 할 수있게했습니다.Azure AD B2C 로컬 계정 암호가 몇 시간 후에 작동을 멈 춥니 다.

내가보기에 문제는 현지 계정입니다. 암호를 만들 수 있고 암호가 몇 시간 동안 올바르게 작동하는지 (정확한 시간이 확실하지 않은 경우) 일반 "잘못된 사용자 이름 또는 암호"를 제공하기 시작합니다. 오류. 같은 사용자에 대해 잘못된 암호를 입력하면 "암호가 틀립니다"라는 다른 메시지가 표시됩니다 (관련 로그 항목에 해당).

나는 응용 프로그램 통찰력을 활성화했으며 다음 예외를 찾을 수 있습니다.

이 두 가지 오류를 해결하는 방법에 대한 도움이 될 것입니다.

""Statebag"": { ""Complex-CLMS"": {}, ""ValidationRequest"": { ""ContentType"": ""Unspecified"", ""Created"": ""2017-10-04T19:17:49.2510644Z"", ""Key"": ""ValidationRequest"", ""Persistent"": true, ""Value"": ""client_id=307&resource=cf87&username=user%domain.com&[email protected]!123&grant_type=password&scope=openid&nca=1;1;login-NonInteractive;False"" }, ""ValidationResponse"": { ""ContentType"": ""Json"", ""Created"": ""2017-10-04T19:17:49.2510644Z"", ""Key"": ""ValidationResponse"", ""Persistent"": true, ""Value"": ""{\""error\"":\""invalid_grant\"",\""error_description\"":\""AADSTS65001: The user or administrator has not consented to use the application with ID '307' named 'IdentityExperienceFramework'. Send an interactive authorization request for this user and resource.\\r\\nTrace ID: 7c4\\r\\nCorrelation ID: 3cc\\r\\nTimestamp: 2017-10-04 19:17:49Z\"",\""error_codes\"":[65001],\""timestamp\"":\""2017-10-04 19:17:49Z\"",\""trace_id\"":\""7c4\"",\""correlation_id\"":\""3cc\""};1;login-NonInteractive;False"" }, ""ComplexItems"": ""_MachineEventQ, REPRM, TCTX, M_EXCP"" } 다음은 여기에 2 예외

""Key"": ""Exception"", ""Value"": { ""Kind"": ""Handled"", ""HResult"": ""80131500"", ""Message"": ""The technical Profile with id \""AAD-UserWriteUsingLogonEmail\"" in Policy id \""B2C_1A_signup_signin of Tenant id \""xxx.onmicrosoft.com\"" requires that an error be raised if a claims principal record already exists for storing claims. A claims principal of type \""User\"" with identifier claim type id \""signInNames.emailAddress\"" does already exist."", ""Data"": { ""IsPolicySpecificError"": true, ""TenantId"": ""xxx.onmicrosoft.com"", ""PolicyId"": ""B2C_1A_signup_signin"", ""TechnicalProfile.Id"": ""AAD-UserWriteUsingLogonEmail"", ""ClaimsPrincipal.IdentifierClaim.ClaimTypeId"": ""signInNames.emailAddress"", ""ClaimsPrincipal.PrincipalType"": ""User"", ""CreateClaimsPrincipalIfItDoesNotExist"": ""True"", ""RaiseErrorIfClaimsPrincipalAlreadyExists"": ""True"", ""RaiseErrorIfClaimsPrincipalDoesNotExist"": ""False"" } }

인 TrustFrameworkExtensions.xml 파일의 내용이다. 그와 예 사이의 유일한 차이점은 내가 두 업체 대신 1

<?xml version="1.0" encoding="utf-8" ?> 
<TrustFrameworkPolicy 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06" 
    PolicySchemaVersion="0.3.0.0" 
    TenantId="xxx.onmicrosoft.com" 
    PolicyId="B2C_1A_TrustFrameworkExtensions" 
    PublicPolicyUri="http://xxx.onmicrosoft.com/B2C_1A_TrustFrameworkExtensions"> 

    <BasePolicy> 
    <TenantId>xxx.onmicrosoft.com</TenantId> 
    <PolicyId>B2C_1A_TrustFrameworkBase</PolicyId> 
    </BasePolicy> 
    <BuildingBlocks> 

    </BuildingBlocks> 

    <ClaimsProviders> 

    <ClaimsProvider> 
     <DisplayName>Local Account SignIn</DisplayName> 
     <TechnicalProfiles> 
     <TechnicalProfile Id="login-NonInteractive"> 
      <Metadata> 
      <Item Key="client_id">307</Item> 
      <Item Key="IdTokenAudience">cf8</Item> 
      </Metadata> 
      <InputClaims> 
      <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="307" /> 
      <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="cf8" /> 
      </InputClaims> 
     </TechnicalProfile> 
     </TechnicalProfiles> 
    </ClaimsProvider> 

    <ClaimsProvider> 
     <Domain>Employee SignIn with Azure AD</Domain> 
     <DisplayName>Employee Login</DisplayName> 
     <TechnicalProfiles> 
      <TechnicalProfile Id="AzureADProfile"> 
       <DisplayName>Employee Login</DisplayName> 
       <Description>Login with your GP account</Description> 
       <Protocol Name="OpenIdConnect"/> 
       <OutputTokenFormat>JWT</OutputTokenFormat> 
       <Metadata> 
        <Item Key="METADATA">https://login.windows.net/yyy.onmicrosoft.com/.well-known/openid-configuration</Item> 
        <Item Key="ProviderName">https://sts.windows.net/7de/</Item> 
        <Item Key="client_id">f19</Item> 
        <Item Key="IdTokenAudience">f19</Item> 
        <Item Key="response_types">id_token</Item> 
        <Item Key="UsePolicyInRedirectUri">false</Item> 
       </Metadata> 
       <CryptographicKeys> 
        <Key Id="client_secret" StorageReferenceId="B2C_1A_AzureADAppSecret"/> 
       </CryptographicKeys> 
       <OutputClaims> 
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="oid"/> 
        <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/> 
        <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" /> 
        <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" /> 
        <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> 
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="contosoAuthentication" /> 
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="AzureADContoso" /> 
       </OutputClaims> 
       <OutputClaimsTransformations> 
        <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/> 
        <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/> 
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/> 
        <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/> 
       </OutputClaimsTransformations> 
       <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/> 
      </TechnicalProfile> 
     </TechnicalProfiles> 
    </ClaimsProvider> 

    <ClaimsProvider> 
     <Domain>google.com</Domain> 
     <DisplayName>Google</DisplayName> 
     <TechnicalProfiles> 
     <TechnicalProfile Id="Google-OAUTH"> 
      <DisplayName>Employee Login</DisplayName> 
      <Protocol Name="OAuth2" /> 
      <Metadata> 
      <Item Key="ProviderName">google</Item> 
      <Item Key="authorization_endpoint">https://accounts.google.com/o/oauth2/auth</Item> 
      <Item Key="AccessTokenEndpoint">https://accounts.google.com/o/oauth2/token</Item> 
      <Item Key="ClaimsEndpoint">https://www.googleapis.com/oauth2/v1/userinfo</Item> 
      <Item Key="scope">email</Item> 
      <Item Key="HttpBinding">POST</Item> 
      <Item Key="UsePolicyInRedirectUri">0</Item> 
      <Item Key="client_id">zzz.apps.googleusercontent.com</Item> 
      </Metadata> 
      <CryptographicKeys> 
      <Key Id="client_secret" StorageReferenceId="B2C_1A_GoogleSecret" /> 
      </CryptographicKeys> 
      <OutputClaims> 
      <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="id" /> 
      <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" /> 
      <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" /> 
      <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name" /> 
      <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> 
      <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="google.com" /> 
      <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" /> 
      </OutputClaims> 
      <OutputClaimsTransformations> 
      <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" /> 
      <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" /> 
      <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" /> 
      <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId" /> 
      </OutputClaimsTransformations> 
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" /> 
      <ErrorHandlers> 
      <ErrorHandler> 
       <ErrorResponseFormat>json</ErrorResponseFormat> 
       <ResponseMatch>$[?(@@.error == 'invalid_grant')]</ResponseMatch> 
       <Action>Reauthenticate</Action> 
       <!--In case of authorization code used error, we don't want the user to select his account again.--> 
       <!--AdditionalRequestParameters Key="prompt">select_account</AdditionalRequestParameters--> 
      </ErrorHandler> 
      </ErrorHandlers> 
     </TechnicalProfile> 
     </TechnicalProfiles> 
    </ClaimsProvider> 

    </ClaimsProviders> 



    <UserJourneys> 
     <UserJourney Id="SignUpOrSignInUsingAzureAD"> 
     <OrchestrationSteps> 

     <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin"> 
      <ClaimsProviderSelections>    
      <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" /> 
      <ClaimsProviderSelection TargetClaimsExchangeId="GoogleExchange" /> 
      <ClaimsProviderSelection TargetClaimsExchangeId="AzureADExchange" /> 
      </ClaimsProviderSelections> 
      <ClaimsExchanges> 
      <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" /> 
      </ClaimsExchanges> 

     </OrchestrationStep> 

     <!-- Check if the user has selected to sign in using one of the social providers --> 
     <OrchestrationStep Order="2" Type="ClaimsExchange"> 
      <Preconditions> 
      <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> 
       <Value>objectId</Value> 
       <Action>SkipThisOrchestrationStep</Action> 
      </Precondition> 
      </Preconditions> 
      <ClaimsExchanges> 
      <ClaimsExchange Id="GoogleExchange" TechnicalProfileReferenceId="Google-OAUTH" /> 
      <ClaimsExchange Id="AzureADExchange" TechnicalProfileReferenceId="AzureADProfile" /> 
      <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="LocalAccountSignUpWithLogonEmail" /> 
      </ClaimsExchanges> 
     </OrchestrationStep> 

     <!-- For social IDP authentication, attempt to find the user account in the directory. --> 
     <OrchestrationStep Order="3" Type="ClaimsExchange"> 
      <Preconditions> 
      <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> 
       <Value>authenticationSource</Value> 
       <Value>localAccountAuthentication</Value> 
       <Action>SkipThisOrchestrationStep</Action> 
      </Precondition> 
      </Preconditions> 
      <ClaimsExchanges> 
      <ClaimsExchange Id="AADUserReadUsingAlternativeSecurityId" TechnicalProfileReferenceId="AAD-UserReadUsingAlternativeSecurityId-NoError" /> 
      </ClaimsExchanges> 
     </OrchestrationStep> 

     <!-- Show self-asserted page only if the directory does not have the user account already (i.e. we do not have an objectId). 
      This can only happen when authentication happened using a social IDP. If local account was created or authentication done 
      using ESTS in step 2, then an user account must exist in the directory by this time. --> 
     <OrchestrationStep Order="4" Type="ClaimsExchange"> 
      <Preconditions> 
      <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> 
       <Value>objectId</Value> 
       <Action>SkipThisOrchestrationStep</Action> 
      </Precondition> 
      </Preconditions> 
      <ClaimsExchanges> 
      <ClaimsExchange Id="SelfAsserted-Social" TechnicalProfileReferenceId="SelfAsserted-Social" /> 
      </ClaimsExchanges> 
     </OrchestrationStep> 

     <!-- This step reads any user attributes that we may not have received when authenticating using ESTS so they can be sent 
      in the token. --> 
     <OrchestrationStep Order="5" Type="ClaimsExchange"> 
      <Preconditions> 
      <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> 
       <Value>authenticationSource</Value> 
       <Value>socialIdpAuthentication</Value> 
       <Action>SkipThisOrchestrationStep</Action> 
      </Precondition> 
      </Preconditions> 
      <ClaimsExchanges> 
      <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" /> 
      </ClaimsExchanges> 
     </OrchestrationStep> 
     <!-- The previous step (SelfAsserted-Social) could have been skipped if there were no attributes to collect 
      from the user. So, in that case, create the user in the directory if one does not already exist 
      (verified using objectId which would be set from the last step if account was created in the directory. --> 
     <OrchestrationStep Order="6" Type="ClaimsExchange"> 
      <Preconditions> 
      <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> 
       <Value>objectId</Value> 
       <Action>SkipThisOrchestrationStep</Action> 
      </Precondition> 
      </Preconditions> 
      <ClaimsExchanges> 
      <ClaimsExchange Id="AADUserWrite" TechnicalProfileReferenceId="AAD-UserWriteUsingAlternativeSecurityId" /> 
      </ClaimsExchanges> 
     </OrchestrationStep> 

     <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" /> 

     </OrchestrationSteps> 
     <ClientDefinition ReferenceId="DefaultWeb" /> 
    </UserJourney> 
    </UserJourneys> 

</TrustFrameworkPolicy> 
+0

고객 ID 및 잠재 고객을 질문입니까, 아니면 실제 가치입니까? (즉, 307 및 cf8) –

+0

저는 잘랐습니다. 일관되게 저는 믿습니다 ... –

답변

0

The user or administrator has not consented to use the application with ID '307' named 'IdentityExperienceFramework'. 

당신이 AZURE 광고 블레이드에서이 응용 프로그램에 사용 권한 부여 버튼을 눌렀이 오류를 사용하고 있다는 것입니다 푸른 내

2 예외 그것은 당신이 다시 사용자 주체를 작성하려고하고 메타 데이터에이 RaiseErrorIfUserPrinci을 가지고처럼 보이는

palExists는 이상한 것은 정말 둘 다없는 몇 시간 후 비밀번호 나던 일이

가장 좋은 건 여기에 정책을 복사하는 이유를 이해하는 나에게 도움이

을 후회하도록 설정하고 우리는 당신이 시도 왜 당신에게 시도 할 수 있습니다 쓰기 대신 쓰기

+0

내 정책과 샘플 간의 유일한 실제 차이점은 trustframeworextensions.xml 파일에 있습니다. 질문에 복사했습니다. –

+0

이전에 권한 부여 버튼을 눌렀다 고 맹세했는데 비밀번호를 눌렀을 때 비밀번호 오류가 발생했지만 2 차 예외가 여전히 존재합니다. –

+0

예제 온라인에 다음 줄이 있지만 AAD-UserWriteUsingLogonEmail 기술 프로필을 추가 ​​할 수 있습니다. true true로 변경하면 오류가 기록되지 않습니다. – user1197563

0

실제 오류는 디렉토리에서 정책과 응용 프로그램 구성의 조합으로 인한 것일 수 있으므로 이러한 응용 프로그램을 이렇게 설치해야하는 이유와 잠재적으로 문제가 될 수있는 이유를 설명합니다 . 근본 원인에 대한 추측이 잘못되었다고해도이 설명을 통해 문제를 더욱 자세히 디버깅 할 수 있기를 바랍니다.

사용자의 암호를 확인해야하는 응용 프로그램을 생각해보십시오. 응용 프로그램에 암호에 대한 액세스 권한이 없기 때문에 사용자 ID와 암호를 사용하여 login.microsoftonline.com에 인증 요청을 보내고 토큰이 성공적으로 발행되었는지 확인하십시오.

그러나이 응용 프로그램에서 요청을 보내면 일부 리소스를 지정해야하며 해당 리소스에 액세스 할 수있는 사용자 권한도 있어야합니다. 일반적인 해결 방법은 관리자가 모든 사용자를 대신하여 사용 권한 (즉, 동의)을 부여하는 것입니다.

IEF는 동일한 모델을 사용합니다. 정책에는 두 가지 응용 프로그램이 있습니다. 하나는 사용자를 대신하여 자원에 토큰을 가져 오는 클라이언트 역할을하는 응용 프로그램입니다. "Custom Policies Get Started Page"에 대한 지침을 따르면 ProxyIdentityExperienceFramework가 클라이언트이고 IdentityExperienceFramework가 리소스입니다.이 지침에 따라 ProxyIdentityExperienceFramework만이 사용자 대신 IdentityExperienceFramework에 토큰을받을 수 있으며 반대의 경우도 마찬가지입니다.

사용자 또는 관리자와 응용 프로그램 을 사용 동의하지 않은 : 당신의 로그에서 오류 메시지를 기반으로

, 는 클라이언트의 ID와 자원을 반전 한 수 보인다 인 ID '307'라는 이름의 'IdentityExperienceFramework'

IdentityExperienceFramework라는 클라이언트는 토큰을 얻을 수있는 액세스 권한이 없습니다.

Azure AD 포털에서 응용 프로그램에 액세스 할 수있는 응용 프로그램을 확인하고 클라이언트 ID와 자원 ID를 업데이트해야합니다.

두 번째 예외는 실제로 의도적으로 설계된 것일 수 있습니다. 단지 디렉터리에 생성되는 사용자가 이미 있다는 것을 나타냅니다. 이는 일반적으로 가입시 발생하며 정책 설정에 따라 일반적으로 계정이 이미 존재하며 대신 로그인해야한다는 오류 메시지를 표시합니다.