AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2011, 12:38   #1  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Из CRM в SP (проблемы идентификации)
Добрый день! Есть такая с виду как несложная задачка. Пользователь пытается из CRM записать документ в SharePoint. При этом CRM и SP находятся в разных доменах, но домен SP доверяет домену CRM и соответственно пользователь CRM со своего домена может без проблем заходить в SP напрямую. На сервере crm написана несложная программка с фрагментом кода:

ClientContext clientContext = new ClientContext(siteUrl);
clientContext.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; <-- не дает правильную учетку
...
clientContext.ExecuteQuery(); <--ошибка аутентификации 401

То есть crm при инициализации сервиса SP обращается к нему с пустой иденификацией, а не с идентификацией того пользователя кто обратился на сервер CRM. Вопрос - эта проблема решается на уровне настроек междоменых отношений или в программе есть способ получить "контейнер" с учеткой пользователя и отправить ее в SP.
При этом - если в одном домене, то оно все работает, также работает, если принудительно для clientContext.Credentials задать домен-логин-пароль.
С Уважением =Л.Владимир.
Старый 15.12.2011, 14:53   #2  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Это классическая проблема передачи токена безопасности. Пользователь авторизуется через веб-приложение, но ваша программа, судя по всему, выполняется от имени сервисной учетной записи.
К сожалению, одного только этого фрагмента кода недостаточно для того, чтобы понять как вам быть. Иногда проблема снимается настройкой Trust for delegation для вашего сервера в консоли AD - Users & Comp. Это задается в свойствах сервера, которому нужно разрешить авторизовываться на других серверах от лица пользователя.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 15.12.2011, 15:11   #3  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Передавайте в этот код каким то образом креденшиалы пользователя у которого есть права на загрузку документов в SP и используйте их в коде:

Код:
ClientContext clientContext = new ClientContext(siteUrl);
clientContext.Credentials = new NetworkCredential(username, password, domain);
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 15.12.2011, 17:34   #4  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Спасибо за ответы. Схема работы такая - сервер MS CRM к нему обращается пользователь со своего ПК через asp.net WEB-форму, встроенную в CRM. А уже под формой внедрена программа на c# для обращению к сервису sharepoint, которая выполняется на серевере СРМ. Способы вытащить в программе domain-login-password, чтобы вставить их credential мне неизвестны, в msdn есть что-то о том что можно прочитать domain-login-password, но оно дает пустые строки, Описание классов здесь:
http://msdn.microsoft.com/en-us/libr...(v=VS.90).aspx


Есть еще варианты с принудительной идентификацией-персонализацией:
http://msdn.microsoft.com/en-us/library/ms998351.aspx

using System.Security.Principal;
...
// Obtain the authenticated user's Identity
WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
// Start impersonating
ctx = winId.Impersonate();
Но как это замутить в программу - непонятно...А требование - писать надо под тем пользователем, кто обратился.
Старый 15.12.2011, 18:31   #5  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от lvi15 Посмотреть сообщение
Способы вытащить в программе domain-login-password, чтобы вставить их credential мне неизвестны
Сомневаюсь, что получится выцепить из контекста. Выход - вынести в конфиг и вычитывать его оттуда.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 15.12.2011, 17:42   #6  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Ну и еще как вариант - применение каких то иных технологий для связи CRM-SP - через WCF???
Старый 15.12.2011, 18:35   #7  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Да в том то все и дело, что обращаться надо не от одного конкретного (тогда бы и проблем не было), а от любого пользователя CRM - и именно он должен попадать на sharepoint для совершения каких-то действий (в данном случае - cоздать строку библиотеки документов)
Старый 15.12.2011, 19:49   #8  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
В контексте страницы вы в стостоянии получить идентификатор, а соответственно домен и логин пользователя, под которым вы зашли на страницу. Далее привожу то, что я нашёл через гугл (и не осуждайте строго - я не разработчик под шарепоинт и мне показалось именно тем, что решит вашу проблему):

http://vspug.com/tanujashares/2007/0...arepoint-2007/
http://www.learningsharepoint.com/20...arepoint-2010/
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 19.12.2011, 19:19   #9  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Добрый вечер! Спасибо за ответы, но они мне не очень помогли. CRM на стороне сервера никак не дает учетку пользователя и соответственно не может уйти в SP. Варианты решений:
1. Написать на стороне SP web-services, к которому crm будет обращаться с фиксированным именем-доменом-паролем и передавать имя пользователя а уже этот сервис пусть пишет этого пользователя в "авторы" записи на SP...
2. Попытаться выполнить код на стороне клиента ??? - то есть получить от сервера CRM данные для записи и из js на стороне клиента обратиться к сервисам SP (здесь то учетка пользователя??)
, - и здесь==>, есть ли возможность подключить к js на стороне клиента внешние библиотеки или запускать программы на стороне клиента - кажется это не совсем просто??? или вообще невозможно???
Старый 19.12.2011, 19:29   #10  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от lvi15 Посмотреть сообщение
CRM на стороне сервера никак не дает учетку пользователя
Можете показать код, который вы используете?

Цитата:
Сообщение от lvi15 Посмотреть сообщение
Написать на стороне SP web-services, к которому crm будет обращаться с фиксированным именем-доменом-паролем и передавать имя пользователя а уже этот сервис пусть пишет этого пользователя в "авторы" записи на SP...
В принципе это же самое и предлагал сделать при помощи имперсонации при вызове вебсервисов SP.

Цитата:
Сообщение от lvi15 Посмотреть сообщение
Попытаться выполнить код на стороне клиента ??? - то есть получить от сервера CRM данные для записи и из js на стороне клиента обратиться к сервисам SP (здесь то учетка пользователя??)
, - и здесь==>, есть ли возможность подключить к js на стороне клиента внешние библиотеки или запускать программы на стороне клиента - кажется это не совсем просто??? или вообще невозможно???
Фантастика. Сомневаюсь, что это вообще как то реализуемо.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit

Последний раз редактировалось a33ik; 19.12.2011 в 19:31.
Старый 19.12.2011, 21:42   #11  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Спасибо за ответ. Код простой, тестировал сейчас уже в одном домене (и CRM и SP), обращаюсь с пользоваттельского (своего) ПК в CRM (сервер на другом пк) и усе - crm идет в SP с чем угодно, но не с моей учеткой. На обоих серверах в записях AD взведены флажки Cerberos в делегировании. Код выполняется по обращению с asp.net страницы, встроенной в crm в соответствии с правилами sdk:

using System;
using System.Diagnostics;
using System.Globalization;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Diagnostics;
using OrgName.Crm.Base;
using OrgName.Crm.CrmSdk;


using SP = Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client;

namespace OrgName.Crm.Realty.Common
{

public class CrmTemplatePage : CrmPage
{

protected void ConnectSP()
{
string siteUrl = "//http://sps10/DocLib/"; //http://sps10/DocLib/
string nameLibname = "Договоры"; //Договоры

ClientContext clientContext = new ClientContext(siteUrl);
clientContext.Credentials = System.Net.CredentialCache.DefaultCredentials; //???


List list = clientContext.Web.Lists.GetByTitle(nameLibname);
clientContext.Load(list);
//Получить в clientContext библиотеку документов "Договоры"
clientContext.ExecuteQuery(); //<====Здесь идет ошибка

}

}
}

То есть меня очень выручит даже некое вербально-идейное описание возможного решения...

Последний раз редактировалось a33ik; 19.12.2011 в 23:07.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
CRM DE LA CREME! CRM 4.0 Disaster Recovery Blog bot Dynamics CRM: Blogs 2 26.02.2016 08:23
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 4 Blog bot Dynamics CRM: Blogs 0 24.09.2011 01:16
Все о Microsoft Dynamics CRM: Как установить Microsoft Dynamics CRM 2011 Beta Blog bot Dynamics CRM: Blogs 0 31.10.2010 15:08
CRM DE LA CREME! Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment Blog bot Dynamics CRM: Blogs 0 18.08.2009 11:05
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0 Deployment Scenarios Blog bot Dynamics CRM: Blogs 0 30.01.2009 22:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:46.