15.12.2011, 12:38 | #1 |
Участник
|
Из 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 |
Moderator
|
Это классическая проблема передачи токена безопасности. Пользователь авторизуется через веб-приложение, но ваша программа, судя по всему, выполняется от имени сервисной учетной записи.
К сожалению, одного только этого фрагмента кода недостаточно для того, чтобы понять как вам быть. Иногда проблема снимается настройкой Trust for delegation для вашего сервера в консоли AD - Users & Comp. Это задается в свойствах сервера, которому нужно разрешить авторизовываться на других серверах от лица пользователя.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
15.12.2011, 15:11 | #3 |
Чайный пьяница
|
Передавайте в этот код каким то образом креденшиалы пользователя у которого есть права на загрузку документов в SP и используйте их в коде:
Код: ClientContext clientContext = new ClientContext(siteUrl); clientContext.Credentials = new NetworkCredential(username, password, domain);
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
15.12.2011, 17:34 | #4 |
Участник
|
Спасибо за ответы. Схема работы такая - сервер 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, 17:42 | #5 |
Участник
|
Ну и еще как вариант - применение каких то иных технологий для связи CRM-SP - через WCF???
|
|
15.12.2011, 18:31 | #6 |
Чайный пьяница
|
Сомневаюсь, что получится выцепить из контекста. Выход - вынести в конфиг и вычитывать его оттуда.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
15.12.2011, 18:35 | #7 |
Участник
|
Да в том то все и дело, что обращаться надо не от одного конкретного (тогда бы и проблем не было), а от любого пользователя CRM - и именно он должен попадать на sharepoint для совершения каких-то действий (в данном случае - cоздать строку библиотеки документов)
|
|
15.12.2011, 19:49 | #8 |
Чайный пьяница
|
В контексте страницы вы в стостоянии получить идентификатор, а соответственно домен и логин пользователя, под которым вы зашли на страницу. Далее привожу то, что я нашёл через гугл (и не осуждайте строго - я не разработчик под шарепоинт и мне показалось именно тем, что решит вашу проблему):
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 |
Участник
|
Добрый вечер! Спасибо за ответы, но они мне не очень помогли. CRM на стороне сервера никак не дает учетку пользователя и соответственно не может уйти в SP. Варианты решений:
1. Написать на стороне SP web-services, к которому crm будет обращаться с фиксированным именем-доменом-паролем и передавать имя пользователя а уже этот сервис пусть пишет этого пользователя в "авторы" записи на SP... 2. Попытаться выполнить код на стороне клиента ??? - то есть получить от сервера CRM данные для записи и из js на стороне клиента обратиться к сервисам SP (здесь то учетка пользователя??) , - и здесь==>, есть ли возможность подключить к js на стороне клиента внешние библиотеки или запускать программы на стороне клиента - кажется это не совсем просто??? или вообще невозможно??? |
|
19.12.2011, 19:29 | #10 |
Чайный пьяница
|
Можете показать код, который вы используете?
Цитата:
Цитата:
Сообщение от lvi15
Попытаться выполнить код на стороне клиента ??? - то есть получить от сервера CRM данные для записи и из js на стороне клиента обратиться к сервисам SP (здесь то учетка пользователя??)
, - и здесь==>, есть ли возможность подключить к js на стороне клиента внешние библиотеки или запускать программы на стороне клиента - кажется это не совсем просто??? или вообще невозможно???
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 19.12.2011 в 19:31. |
|
19.12.2011, 21:42 | #11 |
Участник
|
Спасибо за ответ. Код простой, тестировал сейчас уже в одном домене (и 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. |
|
19.12.2011, 23:10 | #12 |
Чайный пьяница
|
Первое - я предлагал аутентифицироваться во время подключения к шарепоинту при помощи креденшиалов вынесенных в какое нибудь хранилище (неважно какое) - где это?
Второе - где попытка получить имя учётной записи пользователя который залогинен в данный момент? Если вы думаете, что DefaultCredentials вас спасут - глубоко ошибаетесь. Третье - где попытка имперсонироваться под текущим пользователем, а ссылки на имперсонацию я предоставил?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 20.12.2011 в 00:28. |
|
20.12.2011, 12:17 | #13 |
Участник
|
Добрый день! Заменил я строку доступа к SP.
А где должна выполняться инперсонализация, здесь же в коде на CRM или надо внедрять код web-сервиса на SP. Вот код с http://vspug.com/tanujashares/2007/0...repoint-2007/: //============================================================================= SPSite site = new SPSite("SiteCollection_Url"); SPWeb web = site.OpenWeb(); SPUser user = web.AllUsers["User_Name"]; SPUserToken token = user.UserToken; SPSite impersonatedSiteCollection = new SPSite("SiteCollection_Url", token); //============================================================================= //====Код на стороне CRM для подключения к web-сервису SP using SP = Microsoft.SharePoint.Client; using Microsoft.SharePoint.Client; namespace OrgName.Crm.Realty.Common { public class CrmTemplatePage : CrmPage { protected void ConnectSP() { string currentUser="User_Name"; //это можно получить из SQL, используя функцию SUSER_SNAME() string currentDomain="Domain"; string siteUrl = "http://sps10/DocLib/"; string nameLib = "Договоры"; ClientContext clientContext = new ClientContext(siteUrl); clientContext.Credentials = new System.Net.NetworkCredential("user", "passw", "domain"); // с этим удается "провалиться" в SP List list = clientContext.Web.Lists.GetByTitle(nameLib); clientContext.Load(list); clientContext.ExecuteQuery(); //<====Здесь идет ошибка 401 }}} Если на стороне CRM - то как "скрещивать" эти два фрагмента кода? Последний раз редактировалось lvi15; 20.12.2011 в 12:19. |
|
20.12.2011, 12:24 | #14 |
Чайный пьяница
|
clientContext.Credentials = new System.Net.NetworkCredential("user", "passw", "domain");
Это криденшиалы - какого пользователя? Если это криденшиалы пользователя, у которого есть права на вызо шарепоинта, то 401 быть не должно.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
20.12.2011, 13:57 | #15 |
Участник
|
Это явные криденшипы назначенного заранее пользователя от CRM (беруться из конфига или прописываются напрямую), и у которых есть права на вход в SP. Также я могу взять (и беру чуть выше по тексту прогр) имя и домен текущего пользователя CRM (а пароль текущего пользователя взять неоткуда - заводить специальный скрытый файл для паролей ???) и теперь (я так понял) надо обратиться к SP c этой известной и разрешенной учеткой и далее где-то как-то для clientContext сделать инперсонализацию на текущего пользователя и уже c его именем clientContext.ExecuteQuery обращается к сервисам SP - хотя может я и ошибаюсь по схеме построения программы?? То есть обращение и работа с сервисами SP должна выполняться от текущего пользователя - да похоже что тема инперсонализации - это близко к решению данной задачи, но куда ее "вставлять"???
Последний раз редактировалось lvi15; 20.12.2011 в 13:59. |
|
20.12.2011, 15:22 | #16 |
Чайный пьяница
|
Цитата:
Цитата:
Цитата:
Сообщение от lvi15
и теперь (я так понял) надо обратиться к SP c этой известной и разрешенной учеткой и далее где-то как-то для clientContext сделать инперсонализацию на текущего пользователя и уже c его именем clientContext.ExecuteQuery обращается к сервисам SP - хотя может я и ошибаюсь по схеме построения программы??
Маленький совет - поменьше эмоций, смайликов и повторяющихся знаков препинания и побольше связности в постах.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|