2011-06-10 2 views
0

누구든지 Windows 자격 증명을 사용하여 CRM 2011 (온 - 프레미스)에서 OrganizationServiceProxy 인스턴스를 만들려고 했습니까? 나는Windows 자격 증명을 사용하여 CRM 2011에서 OrganizationServiceProxy 인스턴스화

 <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows"/> 
     </security> 

을 사용하는 WCF 서비스를하고 난 사용자가 (OperationContext.Current.ServiceSecurityContext.WindowsIdentity.IsAuthenticated)를 인증하지만 난/생성하는 방법을 알고에 ClientCredentials를 통과하지 않는 것을 확인할 수 있어요 CRM 서비스의 인스턴스를 만듭니다. 이것은 CRM 내부의 IFrame에없는 Silverlight 응용 프로그램에서 호출됩니다.

감사합니다.

답변

1

OrganizationServiceProxy에 로그인하려면 별도의 사용자 계정을 사용해야합니다. 인증을 위해 프록시에 전달할 Windows 자격 증명을 검색 할 수 없습니다.

사용하는 사용자는 prvActOnBehalfOfAnotherUser 권한이 필요합니다.

성공적으로 로그인하고 유효한 OrganizationServiceProxy를 검색 할 수있게되면 서비스 소비자로해야 할 일은 CallerId에서 작업을 호출 할 때마다 CallerId를 지정하는 것입니다. 이 토큰은 Xrm.Page.context.getUserId을 사용하여 xrm 모델에서 검색해야합니다. 만나다. http://msdn.microsoft.com/en-us/library/gg334511.aspx.

실버 라이트에서브릿지를 사용하여 클라이언트 사이드 자바 스크립트를 실행하여 crm에 로그인 한 현재 사용자의 사용자 ID를 검색합니다. 응용 프로그램 부트 스트랩시이 작업을 수행하고 applicationdata 변수에 값을 저장하여 실버 라이트 앱에서 전역 적으로 액세스 할 수 있도록하는 것이 좋습니다.

예 : 클라이언트 측 스크립트의

function CrmContext() { 
} 

var context = null; 
with (window.parent) { 
    context = Xrm.Page.context;} 

CrmContext.prototype.ReadUserId = function() { 
    var userId = context.getUserId(); 
    return userId; 
} 

이 값

예와 프록시 발신 번호 표시 설정 한 사용자 토큰을 일단.

private OrganizationServiceProxy Proxy { get; set; } 

public Guid Create(CreateEntity request) 
{ 
    if (request == null || request.UserId == Guid.Empty || request.Entity == null) 
    { 
     throw new InvalidMessageException("Invalid reqest message. Please provide compulsory criteria"); 
    } 

    var result = Guid.Empty; 

    try 
    { 
     if (Proxy != null) 
     { 
      Proxy.CallerId = request.UserId; 

      using (Proxy) 
      { 
       result = Proxy.Create(request.Entity); 
      } 
     } 
    } 
    catch (FaultException<OrganizationServiceFault> e) 
    { 
     Log.Error(e.Message); 
     throw new IntegrationException(e.Message); 
    } 

    return result; 
} 

이를 해결하기 위해 취해진 방식 필자

는 CRM 어댑터 CRM은 프록시를 캡슐화하고 사용자 토큰을 포함하는 서비스 인터페이스로 요청을 보내는 개체를 생성 하였다.

public OrganizationServiceAdapter(ICrmConfigurationContext crmConfigurationConext) 
{ 
    try 
    { 
     Proxy = new OrganizationServiceProxy(
      crmConfigurationConext.OrganizationServiceConfiguration, 
      crmConfigurationConext.Credentials); 
    } 
    catch (Exception e) 
    { 
     //// TODO: Add local proxy pattern implementation for failover 
     Proxy = null; 
     Log.Error(e.Message); 
     throw new IntegrationException(ExceptionMessages.CouldNotLoginToOrganizationService()); 
    } 
}