2009-02-03 13 views
7

Creé una aplicación que accede al servicio web de CRM. El problema es que cuando implementé el dll en el servidor Sharepoint, devolvió el error 401 no autorizado. Aparentemente el System.Net.CredentialCache.DefaultCredentials no funcionó (mi sospecha). Aquí está el código.DefaultCredentials in Access to CRM/Sharepoint Web Services

CrmSdk.CrmAuthenticationToken token = new CrmSdk.CrmAuthenticationToken(); 
token.AuthenticationType = AuthenticationType.AD; 
token.OrganizationName = ORGANIZATION_NAME; 

CrmService service = new CrmService(); 
service.Url = "http://crmserver:5555/mscrmservices/2007/crmservice.asmx"; 
service.CrmAuthenticationTokenValue = token; 
service.PreAuthenticate = true; 
service.Credentials = System.Net.CredentialCache.DefaultCredentials; 

Va al revés.

Cuando realicé una aplicación que accede al servicio web de Sharepoint (codificando el complemento) y lo despliego en el servidor CRM. No pudo acceder al servicio web de Sharepoint. Error no autorizado. Aquí está el código:

Lists listService = new Lists(); 
listService.PreAuthenticate = true; 
listService.Credentials = System.Net.CredentialCache.DefaultCredentials; 
listService.Url = "http://sharepointserver/webname/_vti_bin/Lists.asmx"; 

Mi servidor CRM y servidor Sharepoint están en el mismo dominio.

Para ambos códigos, si cambié la parte de credenciales en algo así y luego la implementé en el servidor, puede ejecutarse.

service.Credentials = new NetworkCredential("username", "password", "domain"); 

Aún así, no quiero hacer esto porque revela la contraseña del usuario en el código. ¿Puede alguien ayudarme?

IIS en ambos servidores no permite el acceso anónimo y usa la autenticación integrada de Windows.

Gracias


De mi equipo local, puedo acceder a los servicios web de CRM o servicios Web de SharePoint. Supongo que estoy autorizado porque las DefaultCredentials enviaron mis credenciales que su contraseña se guardó en "Nombre de usuario y contraseña almacenados" (Panel de control> Cuentas de usuario> pestaña Avanzado> Administrar contraseñas) De esta manera, no lo hago tiene que escribir:

service.Credentials = new NetworkCredential("username", "password", "domain"); 

y mis DefaultCredentials de mi comp local están autorizados para acceder a los servicios web.

Intenté implementar esto en el servidor Sharepoint que accede a los servicios web de CRM. y..tadaa..it no funcionará. jajaja ..

¿podemos inyectar credenciales a DefaultCredentials en el servidor?

la última cosa que quiero hacer es codificar el UserAccount (como el código anterior)

Respuesta

1

Podría ser que usted necesita estar en ejecución Kerberos para la autenticación, pero no puede estar seguro y es un dolor de configurar simplemente verificar.

+0

Hm..He verificado antes y el servidor utiliza la autenticación Kerberos. cualquier otra opción u opinión? : D gracias de todos modos: D – cyrene

1

¿Ha verificado que las credenciales predeterminadas son las mismas que las explicitamente? Es posible que las credenciales predeterminadas sean las de otra cuenta que no esperarías.

editar # 1: Por las observaciones para el DefaultCredentials property on MSDN:

DefaultCredentials representa los credenciales del sistema para el contexto de seguridad actual en el que la aplicación se está ejecutando .Para una aplicación de cliente , estas son generalmente las credenciales de Windows (nombre de usuario , contraseña y dominio) del usuario que ejecuta la aplicación. Para las aplicaciones ASP.NET , las credenciales predeterminadas son las credenciales de usuario del usuario que inició sesión, o el usuario que se suplanta.

También querrá asegurarse de que el usuario que accede a la página de CRM (que hace la llamada al servicio web de SharePoint) puede acceder al servicio web con sus credenciales y viceversa. Si pueden, entonces parece más probable que esté ocurriendo algún tipo de suplantación.

Editar # 2: Asumiendo que tiene acceso tanto al servidor de CRM como al servidor de SharePoint, puede tener un pico en los registros de la aplicación y del sistema. Uno o ambos deberían indicar un inicio de sesión fallido e indicar qué cuenta intentó acceder al recurso (en este caso, los servicios web).

+0

hm ... No indiqué el valor de la credencial predeterminada. Acabo de usarlo, y ¿no se supone que debe encontrar por sí mismo la credencial correspondiente necesaria para enviarla al servicio web? cómo verificar la credencial predeterminada? como no podemos ver el nombre de usuario y la contraseña, ¿podemos? gracias :) – cyrene

+0

agregó una actualización, puede intentar verificar los registros, pueden mostrar el inicio de sesión fallido y señalarle a la cuenta que está intentando acceder al servicio (s). –

+0

gracias por su actualización :) Eché un vistazo a los registros de CRM, y aunque he desactivado el acceso anónimo en IIS, la cuenta que intenta acceder al servicio es uno de los usuarios de CRM. Me pregunto por qué las credenciales predeterminadas en Sharepoint resultaron ser ese usuario. Buscaré más información. gracias :) – cyrene

0

service.Credentials = System.Net.CredentialsCache.DefaultNetworkCredentials;

Pruébalo.

+0

Lo he intentado y no funcionó. He leído msdn y no puedo distinguir la diferencia entre DefaultCredentials y DefaultNetworkCredentials. pero, gracias :) – cyrene

0

para ser capaces DefaultCredentials uso, el usuario en el directorio activo debe ser definida tanto en SharePoint y CRM y tienen privilegios suficientes para hacer lo que está haciendo con el código.

Y trate de usar sdk (crm tenga clases de ayuda) en lugar de definiciones de servicio.

1

Al utilizar DefaultCredentials, el proceso de trabajo de ASP.NET o el proceso de trabajo de IIS tomarán la credencial del usuario que ejecuta el grupo de aplicaciones de IIS.

así que si su grupo de aplicaciones de Dynamics CRM se ejecuta bajo una cuenta de usuario Custom-CRM-Domain \ JohnDoe, eso significa que tomará los privilegios en la cuenta de usuario Custom-CRM-Domain \ JohnDoe.

Compruebe la cuenta de usuario que ejecuta el grupo de aplicaciones de la aplicación web CRM \ Sharepoint Application IIS.

Estos son los pasos para comprobar el inventario de aplicación:

  1. Abrir la página web -> clic derecho -> Elija Propiedades
  2. Seleccione la ficha Directorio
  3. Aviso el nombre del grupo de aplicaciones en la lista desplegable debajo de
  4. Ahora, vaya a la carpeta Grupos de aplicaciones
  5. Intente encontrar el nombre del grupo de aplicaciones que se ha enumerado en el paso 3 -> haga clic derecho y elija Propiedades
  6. Seleccione la pestaña "Identidad" y que se encuentra la cuenta de usuario que dirige el grupo de aplicaciones

Espero que esto ayude.

0

Para solucionar este problema, primero debe saber qué usuario ejecuta el grupo de aplicaciones como dijeron los demás y si necesita usar CredentialCache.DefaultCredentials, debe agregar el usuario, por ejemplo, svcadmin o similar, en "Sitio secundario administrador de la colección "ejecutando la aplicación de administración central de SharePoint. Mediante ese SP, se permite al usuario que ha pasado la credencial acceder a las cosas que necesita. enter image description here