Type | Value | Description |
AD | 0 | Specifies Active Directory authentication. |
Passport | 1 | Specifies Windows Live ID authentication. |
Spla | 2 | Specifies Internet-Facing Deployment authentication |
1. Active Directory authentication.
try{
String username = "domain\\user";
String password = "password";
String authType = "AD";
String OrganizationName = "orgName";
String hostBame = "http://xxx.xxx.x.xxx";
String CrmDiscoveryURL = hostBame + "/MSCRMServices/2007/"+ authType + "/CrmDiscoveryService.asmx";
CrmDiscoveryURL = CrmDiscoveryURL.toLowerCase();
CrmDiscoveryServiceLocator discoveryServiceLoc = new CrmDiscoveryServiceLocator();
discoveryServiceLoc.setCrmDiscoveryServiceSoapEndpointAddress(CrmDiscoveryURL);
CrmDiscoveryService discoveryService = (CrmDiscoveryService) discoveryServiceLoc;
CrmDiscoveryServiceSoapStub discoveryServiceSoap = (CrmDiscoveryServiceSoapStub) discoveryService.getCrmDiscoveryServiceSoap();
discoveryServiceSoap.setUsername(username);
discoveryServiceSoap.setPassword(password);
RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest();
orgRequest.setUserId(username);
orgRequest.setPassword(password);
RetrieveOrganizationsResponse orgResp = (RetrieveOrganizationsResponse) discoveryServiceSoap.execute(orgRequest);
OrganizationDetail orgInfo = null;
com.microsoft.schemas.crm._2007.CrmDiscoveryService.ArrayOfOrganizationDetail arrayOfDetail= orgResp.getOrganizationDetails();
OrganizationDetail[] orgdetails = arrayOfDetail.getOrganizationDetail();
for (int i = 0; i < orgdetails.length; i++) {
System.out.println("orgdetails[i].getOrganizationName() = "+ orgdetails[i].getOrganizationName());
if (orgdetails[i].getOrganizationName().equalsIgnoreCase(OrganizationName)) {
orgInfo = orgdetails[i];
break;
}
}
int AD = 0;
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.setAuthenticationType(AD);
token.setOrganizationName(OrganizationName);
String CrmServiceUrl = orgInfo.getCrmServiceUrl();
CrmServiceSoapStub adminBinding = (CrmServiceSoapStub) new CrmServiceLocator().getCrmServiceSoap(new URL(CrmServiceUrl));
adminBinding.setHeader("http://schemas.microsoft.com/crm/2007/WebServices","CrmAuthenticationToken", token);
adminBinding.setUsername(username);
adminBinding.setPassword(password);
WhoAmIRequest whoRequest = new WhoAmIRequest();
WhoAmIResponse whoResp = (WhoAmIResponse) adminBinding.execute(whoRequest);
String UserId = whoResp.getUserId();
System.out.println("userid = "+ UserId);
}catch(Exception e){
e.printStackTrace();
}
2. Passport Authentication
Sample code
String authType = "Passport";
CrmDiscoveryServiceLocator discoveryServiceLoc = new CrmDiscoveryServiceLocator();
discoveryServiceLoc.setCrmDiscoveryServiceSoapEndpointAddress("http://" + hostName + "/MSCRMServices/2007/" + authType + "/CrmDiscoveryService.asmx");
CrmDiscoveryService discoveryService = (CrmDiscoveryService) discoveryServiceLoc;
CrmDiscoveryServiceSoapStub discoveryServiceSoap = (CrmDiscoveryServiceSoapStub) discoveryService.getCrmDiscoveryServiceSoap();
// Retrieve Policy Request
RetrievePolicyRequest policyRequest = new RetrievePolicyRequest();
RetrievePolicyResponse policyResponse = (RetrievePolicyResponse) discoveryServiceSoap.execute(policyRequest);
String passportTicket = getPassportTicket(policyResponse.getPolicy(),userName, password);
RetrieveCrmTicketRequest crmTicketRequest = new RetrieveCrmTicketRequest();
crmTicketRequest.setOrganizationName(organization);
crmTicketRequest.setPassportTicket(passportTicket);
crmTicketResponse = (RetrieveCrmTicketResponse) discoveryServiceSoap.execute(crmTicketRequest);
if (crmTicketResponse != null) {
CrmAuthenticationToken token = new CrmAuthenticationToken();
int PASSPORT = 1;
token.setAuthenticationType(
PASSPORT
);
token.setCallerId("00000000-0000-0000-0000-000000000000");
token.setOrganizationName(crmTicketResponse.getOrganizationDetail().getOrganizationName());
token.setCrmTicket(crmTicketResponse.getCrmTicket());
String crmServiceUrl = crmTicketResponse.getOrganizationDetail().getCrmServiceUrl();// we can store it in db w.r.t user,pass,org and retrieve
CrmServiceSoapStub crmServiceSoapStub = (CrmServiceSoapStub) new CrmServiceLocator().getCrmServiceSoap(new URL(crmServiceUrl));
crmServiceSoapStub.setHeader("http://schemas.microsoft.com/crm/2007/WebServices","CrmAuthenticationToken", token);
WhoAmIRequest whoRequest = new WhoAmIRequest();
whoRequest.setOptionalParameters(new OptionalParameter[] {});
WhoAmIResponse whoResp = (WhoAmIResponse) crmServiceSoapStub.execute(whoRequest);
System.out.println("----------getUserId()----------------->"+ whoResp.getOrganizationId());
}
private String getPassportTicket(String policy, String userName, String password) {
String ticket= null;
try{
String passportDomain = "crm.dynamics.com";//partner
String environment = "Production";
ticket = new MSLogonManager().logon(userName, password, passportDomain, policy, environment);
System.out.println("ticket = "+ticket);
}catch(Exception e){
e.printStackTrace();
}
return ticket;
}
3. IFD Authentication
String hostBame = "https://xx.xxxx.xxx";
String OrganizationName = "orgName";
String username = "usernam";
String password = "password";
String CrmDiscoveryURL = hostBame+"/mscrmservices/2007/spla/crmdiscoveryservice.asmx";
CrmDiscoveryServiceLocator discoveryServiceLoc = new CrmDiscoveryServiceLocator();
discoveryServiceLoc.setCrmDiscoveryServiceSoapEndpointAddress(CrmDiscoveryURL);
CrmDiscoveryService discoveryService = (CrmDiscoveryService) discoveryServiceLoc;
CrmDiscoveryServiceSoapStub discoveryServiceSoap = (CrmDiscoveryServiceSoapStub) discoveryService.getCrmDiscoveryServiceSoap();
discoveryServiceSoap.setUsername(username);
discoveryServiceSoap.setPassword(password);
RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest();
orgRequest.setUserId(username);
orgRequest.setPassword(password);
RetrieveOrganizationsResponse orgResp = (RetrieveOrganizationsResponse) discoveryServiceSoap.execute(orgRequest);
OrganizationDetail orgInfo = null;
com.microsoft.schemas.crm._2007.CrmDiscoveryService.ArrayOfOrganizationDetail arrayOfDetail = orgResp.getOrganizationDetails();
OrganizationDetail[] orgdetails = arrayOfDetail.getOrganizationDetail();
for (int i = 0; i < orgdetails.length; i++) {
System.out.println(" getIFDBindingToCrm orgdetails[i].getOrganizationName() "+ orgdetails[i].getOrganizationName());
if (orgdetails[i].getOrganizationName().equalsIgnoreCase(OrganizationName)) {
orgInfo = orgdetails[i];
break;
}
}
RetrieveCrmTicketRequest crmTicketRequest = new RetrieveCrmTicketRequest();
crmTicketRequest.setOrganizationName(OrganizationName);//orgInfo.getOrganizationName());
crmTicketRequest.setUserId(username);
crmTicketRequest.setPassword(password);
RetrieveCrmTicketResponse crmTicketResponse = (RetrieveCrmTicketResponse) discoveryServiceSoap.execute(crmTicketRequest);
if (crmTicketResponse != null) {//
int IFD = 2;
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.setAuthenticationType(IFD);
token.setOrganizationName(orgInfo.getOrganizationName());
token.setCrmTicket(crmTicketResponse.getCrmTicket());
String CrmServiceUrl = orgInfo.getCrmServiceUrl();
System.out.println("CrmServiceUrl-" + CrmServiceUrl);
CrmServiceSoapStub adminBinding = (CrmServiceSoapStub) new CrmServiceLocator().getCrmServiceSoap(new URL(CrmServiceUrl));
adminBinding.setHeader("http://schemas.microsoft.com/crm/2007/WebServices","CrmAuthenticationToken", token);
adminBinding.setUsername(username);
adminBinding.setPassword(password);
WhoAmIRequest whoRequest = new WhoAmIRequest();
WhoAmIResponse whoResp = (WhoAmIResponse) adminBinding.execute(whoRequest);
String UserId = whoResp.getUserId();
System.out.println("UserId="+UserId);
}
--------
Edited: Mar 20, 2013
In the above code, we have used the MSLogonManager class(its the bridge to dll file which is created using .net sdk) to get the ticket.
Another way to get the ticket is:
#2. we can create a proxy service that handles auth and the connection and get the ticket using the CRM services in .NET and then you define your web service SOAP interface you want Java to use.
#3. Use the following xml request.. this is get by http tracker
private String getPassportTicket(String policy, String userName, String password) {
String
ticket
= null;
try{
URL url = new URL( "https://login.live.com/RST2.srf" );
HttpURLConnection rc = (HttpURLConnection)url.openConnection();
rc.setRequestMethod("POST");
rc.setDoOutput( true );
rc.setDoInput( true );
rc.setRequestProperty( "Content-Type", "text/xml; charset=utf-8" );
String reqStr = new String(" "xmlns:wst=\"http://schemas.xmlsoap.org/ws/2005/02/trust\"> "+
" "+
"http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue "+
"HTTPS://login.live.com:443//RST2.srf "+
""+
""+userName+" "+
""+password+" "+
" "+
" "+
" "+
""+
""+
"http://schemas.xmlsoap.org/ws/2005/02/trust/Issue "+
""+
""+
"passportDomain "+
" "+
" "+
" "+
" "+
" "+
" ");
int len = reqStr.length();
rc.setRequestProperty( "Content-Length", Integer.toString( len ) );
rc.connect();
OutputStreamWriter out = new OutputStreamWriter( rc.getOutputStream() );
out.write( reqStr, 0, len );
out.flush();
InputStreamReader read = new InputStreamReader( rc.getInputStream() );
StringBuffer sb = new StringBuffer();
int ch = read.read();
while( ch != -1 ){
sb.append((char)ch);
ch = read.read();
}
String response = sb.toString();
read.close();
rc.disconnect();
ticket = response.substring(response.indexOf("")+ "".length(),
response.indexOf(" "));
System.out.println("passportTicket = "+result);
return ticket;
}
David,
ReplyDeleteDo you have this example working?
Thanks,
-gogo
Hi gogo,
ReplyDeleteI will try to post here with in a week.
Thanks
Your week is up. ;-)
ReplyDeleteThanks for pushing me..:) Its Addded now.
DeleteHi, can you tell where you get the class MSLogonManager, thank you!
ReplyDelete