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, 17:42   #5  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Ну и еще как вариант - применение каких то иных технологий для связи CRM-SP - через WCF???
Старый 15.12.2011, 18:31   #6  
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, 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.
Старый 19.12.2011, 23:10   #12  
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
Первое - я предлагал аутентифицироваться во время подключения к шарепоинту при помощи креденшиалов вынесенных в какое нибудь хранилище (неважно какое) - где это?

Второе - где попытка получить имя учётной записи пользователя который залогинен в данный момент? Если вы думаете, что DefaultCredentials вас спасут - глубоко ошибаетесь.

Третье - где попытка имперсонироваться под текущим пользователем, а ссылки на имперсонацию я предоставил?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

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

Последний раз редактировалось a33ik; 20.12.2011 в 00:28.
Старый 20.12.2011, 12:17   #13  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Добрый день! Заменил я строку доступа к 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  
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
clientContext.Credentials = new System.Net.NetworkCredential("user", "passw", "domain");

Это криденшиалы - какого пользователя? Если это криденшиалы пользователя, у которого есть права на вызо шарепоинта, то 401 быть не должно.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 20.12.2011, 13:57   #15  
lvi15 is offline
lvi15
Участник
 
8 / 10 (1) +
Регистрация: 12.11.2009
Это явные криденшипы назначенного заранее пользователя от CRM (беруться из конфига или прописываются напрямую), и у которых есть права на вход в SP. Также я могу взять (и беру чуть выше по тексту прогр) имя и домен текущего пользователя CRM (а пароль текущего пользователя взять неоткуда - заводить специальный скрытый файл для паролей ???) и теперь (я так понял) надо обратиться к SP c этой известной и разрешенной учеткой и далее где-то как-то для clientContext сделать инперсонализацию на текущего пользователя и уже c его именем clientContext.ExecuteQuery обращается к сервисам SP - хотя может я и ошибаюсь по схеме построения программы?? То есть обращение и работа с сервисами SP должна выполняться от текущего пользователя - да похоже что тема инперсонализации - это близко к решению данной задачи, но куда ее "вставлять"???

Последний раз редактировалось lvi15; 20.12.2011 в 13:59.
Старый 20.12.2011, 15:22   #16  
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 (беруться из конфига или прописываются напрямую), и у которых есть права на вход в SP
Ок. Это именно то что я имел ввиду.

Цитата:
Сообщение от lvi15 Посмотреть сообщение
Также я могу взять (и беру чуть выше по тексту прогр) имя и домен текущего пользователя CRM (а пароль текущего пользователя взять неоткуда - заводить специальный скрытый файл для паролей ???)
Если посмотрите ссылки по имперсонации пароль нигде не нужен, так что всё корректно.

Цитата:
Сообщение от lvi15 Посмотреть сообщение
и теперь (я так понял) надо обратиться к SP c этой известной и разрешенной учеткой и далее где-то как-то для clientContext сделать инперсонализацию на текущего пользователя и уже c его именем clientContext.ExecuteQuery обращается к сервисам SP - хотя может я и ошибаюсь по схеме построения программы??
Всё корректно. Я именно это и имел ввиду с самого начала поста.

Маленький совет - поменьше эмоций, смайликов и повторяющихся знаков препинания и побольше связности в постах.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 15:52.