18.03.2010, 16:10 | #1 |
Участник
|
Доступ к данным из IFD CRM
Чета никак не могу разобраться... Есть хостинговая CRM, то есть пользователь при входе использует IFD и вводит логин/пароль на форме. Пишу кастомную страницу, которая должна работать с CrmService. Как правильно создать инстанс сервиса?
В SDK есть статья Web Form (IFD) Authentication, но там в CrmDiscoveryService передают логин и пароль пользователя. А как быть мне если я его не знаю, пользователь уже залогинился и ему нудно работаь с моей страницей. |
|
18.03.2010, 16:40 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от ZooY
Чета никак не могу разобраться... Есть хостинговая CRM, то есть пользователь при входе использует IFD и вводит логин/пароль на форме. Пишу кастомную страницу, которая должна работать с CrmService. Как правильно создать инстанс сервиса?
В SDK есть статья Web Form (IFD) Authentication, но там в CrmDiscoveryService передают логин и пароль пользователя. А как быть мне если я его не знаю, пользователь уже залогинился и ему нудно работаь с моей страницей. X++: string orgname = Request.QueryString["orgname"]; using (new CrmImpersonator()) { CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgname); CrmService crmservice = new CrmService(); crmservice.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/CrmService.asmx"; crmservice.UseDefaultCredentials = true; crmservice.CrmAuthenticationTokenValue = token; //работа с вебсервисами тоже происходит здесь }
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: ZooY (1). |
18.03.2010, 17:01 | #3 |
Участник
|
ААААА... Вот оно - CrmImpersonator... Веришь - нет - сколько пишу кода всякого, никогда не приходилось этим пользоваться. Спасибо!
|
|
18.03.2010, 20:45 | #4 |
Участник
|
Кстати, для On-Premise такой подход у меня не заработал.
|
|
18.03.2010, 20:54 | #5 |
Чайный пьяница
|
Странно. А можете показать web.config страницы?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
24.03.2010, 15:33 | #6 |
Участник
|
X++: <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> <appSettings/> <connectionStrings/> <system.web> <customErrors mode="Off"/> <compilation debug="false"> <assemblies> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="Microsoft.Crm.SdkTypeProxy, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></assemblies> </compilation> <authentication mode="Windows"/> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </controls> </pages> <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> </httpHandlers> <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpModules> </system.web> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="WarnAsError" value="false"/> </compiler> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="OptionInfer" value="true"/> <providerOption name="WarnAsError" value="false"/> </compiler> </compilers> </system.codedom> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <remove name="ScriptModule"/> <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </modules> <handlers> <remove name="WebServiceHandlerFactory-Integrated"/> <remove name="ScriptHandlerFactory"/> <remove name="ScriptHandlerFactoryAppServices"/> <remove name="ScriptResource"/> <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </handlers> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration> |
|
24.03.2010, 20:44 | #7 |
Чайный пьяница
|
<authentication mode="Windows"/> - надо удалить и добавить <identity impersonate="true"/>
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
25.03.2010, 17:25 | #8 |
Участник
|
Не, это ничего не дало. Причем ошибка странная какая то:
Цитата:
Server was unable to process request.
systemuser With Id = 5b393b63-99f6-dd11-89ac-0003ffaf0812 Does Not Exist |
|
25.03.2010, 21:02 | #9 |
Чайный пьяница
|
Цитата:
Код: <add name="MapOrg" type="Microsoft.Crm.MapOrgEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="CrmAuthentication" type="Microsoft.Crm.Authentication.AuthenticationEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> Код: <httpModules> <add name="MapOrg" type="Microsoft.Crm.MapOrgEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="CrmAuthentication" type="Microsoft.Crm.Authentication.AuthenticationEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules>
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.03.2010, 14:32 | #10 |
Участник
|
Не помогло
Кстати, вот этот GUID 5b393b63-99f6-dd11-89ac-0003ffaf0812, который светиться в ошибке... Если проверить параметр service.CrmAuthenticationTokenValue.CallerId то вот он как раз там. Учитывая что такого пользователя действительно нет в CRM, понятно почему такая ошибка. но не понятно откуда этот пользователь берется. Последний раз редактировалось ZooY; 30.03.2010 в 14:35. |
|
30.03.2010, 14:41 | #11 |
Учаснег
|
Поищите такого юзера через sql , скорее всего этот систем или integration.
посмотрел наши web.conf стоит <authentication mode="Windows"/> все работает. using (new CrmImpersonator()) { //Create a token with the static method. ExtractCrmAuthenticationToken //The 'Context' used here is the Page.Context. CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgname); CrmService service = new CrmService(); service.CrmAuthenticationTokenValue = token; service.Credentials = CredentialCache.DefaultCredentials; Все в рамках такой конструкции } ничего более особенного не делали. А вот еще что вспомнил, обязательное расположение вроде как должно быть в ISV, как в другой директории размещать есть способо в интернет описывающий.
__________________
http://about.me/fedorovigor |
|
30.03.2010, 15:27 | #12 |
Участник
|
Цитата:
Сообщение от IgorF
Поищите такого юзера через sql , скорее всего этот систем или integration.
посмотрел наши web.conf стоит <authentication mode="Windows"/> все работает. using (new CrmImpersonator()) { //Create a token with the static method. ExtractCrmAuthenticationToken //The 'Context' used here is the Page.Context. CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgname); CrmService service = new CrmService(); service.CrmAuthenticationTokenValue = token; service.Credentials = CredentialCache.DefaultCredentials; Все в рамках такой конструкции } ничего более особенного не делали. А вот еще что вспомнил, обязательное расположение вроде как должно быть в ISV, как в другой директории размещать есть способо в интернет описывающий. Только непонятно причем тут этот инстанс, если я четко задаю имя организации. Или эта конструкция работает не работает с мультиорганизационной установкой CRM? А деляю все точно так. Даже попробовал переделал свой код точно так, как вы написали - результат тот же. |
|
30.03.2010, 15:53 | #13 |
Участник
|
Нашел вот такую тему
http://social.microsoft.com/Forums/e...0-e22814bd04ba Возможно проблема в том, что я запускаю свое расширение по адресу http://serverort/ISV/MyApp а нужно типа по адресу http://serverort/MyOrg/ISV/MyApp, но по этому адресу оно просто не открывается |
|
30.03.2010, 16:13 | #14 |
Учаснег
|
Цитата:
Сообщение от ZooY
Опа... Нашел такого пользователя. Это один из пользователей (а точнее первый по порядку) в другом, дефолтном, инстансе CRM.
Только непонятно причем тут этот инстанс, если я четко задаю имя организации. Или эта конструкция работает не работает с мультиорганизационной установкой CRM? А деляю все точно так. Даже попробовал переделал свой код точно так, как вы написали - результат тот же.
__________________
http://about.me/fedorovigor |
|
30.03.2010, 19:39 | #15 |
Участник
|
В общем убрал из web.config все, сократив его до вот такого:
X++: <?xml version="1.0"?> <configuration> <appSettings/> <connectionStrings/> <system.web> <httpModules> <add name="MapOrg" type="Microsoft.Crm.MapOrgEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="CrmAuthentication" type="Microsoft.Crm.Authentication.AuthenticationEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules> <identity impersonate="true"/> <compilation debug="true"> <assemblies> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="Microsoft.Crm.SdkTypeProxy, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> </system.web> </configuration> |
|
30.03.2010, 20:33 | #16 |
Участник
|
Наконец то появилось некоторое понимание того, что происходит %)
Мое расширение не открывалось по адресу http://server:рort/MyOrg/ISV/MyApp потому что стартовой страницей был не ASPX, а HTML файл. В общем получается такая картина, если открывать расширение по адресу http://server:рort/MyOrg/ISV/MyApp то правильно определяется текущий пользователь, потому как срабатывает MapOrg, и сервис считывает данные из правильного инстанса CRM. Но при этом не работают возможности 3.5ого фреймворка. Если же открывать расширение по адресу http://server:рort/ISV/MyApp то MapOrg не срабатывает, пользователь определяется неправильно, но зато все возможности фреймворка наличиствуют. Надо полагать в CRM не хватает каких то фреймворковых библиотек, но каких? Кстати опыты показали что в web.config вовсе не нужно добавлять строки с настройкой имперсонализации и модулям, потому что они есть в web.config самого CRM. (это при условии конечно что ваше расширение устанавливается в папку ISV) |
|
30.03.2010, 20:47 | #17 |
Участник
|
В SDK написано, что CRM поддерживает Framework 3.0. Но на сервере установлен 3.5. Не понятно почему так получается, что если срабатывает MapOrg то приложение перестает поддерживать 3.5 фреймворк.
|
|
30.03.2010, 21:08 | #18 |
Чайный пьяница
|
Посмотрите этот топик. Вроде как Ваша ситуация.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: ZooY (1). |
30.03.2010, 22:24 | #19 |
Участник
|
Мне кажется я до конца понял как это все работает, и насчет 3.5 фреймворка и насчет всего остального. НО...
Как я раньше писал расширения... Делаеш в VS проект типа Веб-сайт. Кладеш его в папку ISV, в IIS настраиваеш как отдельное Веб-расширение и потом обращаешся по адресу /ISV/MyApp/ Имя организации передаеш пареметром в строке адреса. Все работает и все прекрасно, при этом все расширение лежит в одной отдельной папочке. В SDK в статье Custom Code Best Practices описан другой, типа более правильны подход к размещению расширений. Там сказано что aspx-файлы должны быть в папке расширения, а все библиотеки в папке bin сервера CRM. ИМХО это не очень парвильно, засорять эту папку своими библиотеками. Там же написано что если у тебя стоит Rollup 2 то можно оставлять библиотеки в папке bin расширения, но для этого нужно прописать их в директиве @Assebly. Объясните пожалуйста как это сделать, я чета ничего не понял. И потом, это как же получается, каждый раз после компиляции сайта нужно во все страницы добавлять эту директиву. В случае перекомпиляции делать это опять... Или как то это можно на автомате делать? |
|
31.03.2010, 07:54 | #20 |
Moderator
|
Насколько я понял, нужно просто перечислить зависимые библиотеки при помощи этой директивы - просто откройте код вашей страницы и поместите эту директиву в начале до тега <html>. В этой же статье (http://msdn.microsoft.com/en-us/library/dd548493.aspx), кстати, описывается альтернативый подход: эти библиотеки можно прописать в web.config вашего приложения. В этом случае использовать @ Assembly не требуется.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
Теги |
c#, ifd, webservice, .net |
|
|