|
14.08.2012, 15:12 | #1 |
MCTS
|
AX 2012: Авторизация при вызове сервисов
Добрый день, пытаюсь решить следующую проблему с авторизацией при вызове сервисов в AX 2012 (build 6.0.1108.670).
Из приложения на C# в Visual Studio вызываю любой Ax-овский сервис (сделал свой кастомный), например: PHP код:
Код: System.ServiceModel.FaultException: Failed to logon to Microsoft Dynamics AX. Решить проблему можно следующим образом (в мануалах по сервисам такого не нашел, опытным путем определилось) - добавить следующий код: PHP код:
Но данный вариант не очень нравится - хранить в коде или в конфигурационном файле учетные данные о пользователе с довольно широкими правами в AX. При этом в настройке сервиса (в конфигурационной утилите в Configure Services) для каждого сервиса можно указать учетные данные (UserPrincipalName - по умолчанию заполняется данными учетной записи, под которой зарущен AOS; либо ServicePrincipalName и т.д.), и потом эта настройка копируется в C#-приложении - создается app.config, включающий в том числе и эти строки PHP код:
Есть ли у кого каеи мысли на этот счет - это просто недоделка пока в AX 2012 (ведь если настройки по userprincipalname есть, значит, они должны использоваться), либо я что-то не так настраиваю? |
|
14.08.2012, 15:26 | #2 |
NavAx
|
Курите binding в сборке, из которой вы обращаетесь к AX.
Вкратце - Basic binding не позволит указать параметры авторизации. Используйте WSHttp binding - там можно указать, кем вы собираетесь представляться сервису. Нужно также будет настроить IIS и сервис в Аксе соответствующим образом. Есть два пути - либо прописать нужный binding в config для сборки, либо собрать его в runtime с нужными параметрами.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... Последний раз редактировалось Maximin; 14.08.2012 в 15:28. |
|
14.08.2012, 16:08 | #3 |
MCTS
|
Maximin, спасибо за ответ.
По умолчанию, AX-овский сервис создается со следующими параметрами в app.config в C#-приложении: PHP код:
В-общем, получается, что binding прописан в config для сборки, но в таком варианте не работает? |
|
15.08.2012, 11:55 | #4 |
NavAx
|
Вам вы еще тогда разобраться - у вас message level security или transport level?
Anyway, реквизиты доступа автоматом из Конфига грузиться не будут, вам нужно сделать это в коде, взяв его из config или откуда-то еще (ConfigurationManager.AppSettings ??). Вообще, пожелание довольно странное - с одной стороны, вы не хотите давать пароль end-userу, а с другой - вам неоткуда взять пароль, как только из самого приложения-клиента, что в общем-то тоже самое, пусть он там и будет зашифрован. Или же вы хотите заставить AX WCF сервис из IIS представляться Аксапте каким-то заранее определенным пользователем? И я что-то не совсем понимаю - что значит Цитата:
По умолчанию, AX-овский сервис создается со следующими параметрами в app.config в C#-приложении:
Нашел у себя ссылки на полезные темы (особенно первая, может наведет на мысль): http://www.ksaelen.be/wordpresses/dy...n-wcf-service/ http://stackoverflow.com/questions/9...iguration-file Вообще, еще у меня была коллекция ссылок по общим темам в плане вообще что там к чему, при чем здесь типы привязок, к чему разные режимы security и прочее. Но это в старых бэкапах. Если будет сильно интересно, могу посмотреть. В этой теме крайне желательно раскурить сначала общие принципы, т.к. штука довольно сложная и куча параметров. При любом фейле в них ничего работать не будет.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... Последний раз редактировалось Maximin; 15.08.2012 в 12:10. |
|
|
За это сообщение автора поблагодарили: gl00mie (2), cherv (1). |
15.08.2012, 16:17 | #5 |
MCTS
|
Maximin, спасибо.
Вообще, пытался разобраться, как в принципе правильно работать с веб-сервисами - если другого варианта, кроме как в любом случае в коде грузить учетные данные, нет, то этого достаточно. Цитата:
Или же вы хотите заставить AX WCF сервис из IIS представляться Аксапте каким-то заранее определенным пользователем?
Цитата:
И я что-то не совсем понимаю - что значит
"По умолчанию, AX-овский сервис создается со следующими параметрами в app.config в C#-приложении: " В той же настройке сервиса в AX есть описание этих параметров - например, напротив UserPrincipalName описание следующее: Specifies settings that enable the client to authenticate the service. At the client, the identity element allows a developer to specify the expected identity of the service. In the security authentication process between the client and service, WCF ensures that the identity of the service matches the value of this element. When set, this element specifies the expected actual principal name of the service. Only one of the settings in this section can have a value. When used in a service endpoint, the identity element defines the identity of the service in WSDL. Я поэтому и подумал, что этот параметр и указывает учетную запись, под которой происходит вызов сервиса - а, как показывает практика, этого не происходит. Вот и в этом был вопрос - то ли это еще не доделано, то ли я неправильно понял, как этот параметр использовать. |
|
15.08.2012, 17:20 | #6 |
NavAx
|
UserPrincipalName и ServicePrincipalName - это уже для того, чтобы клиентское приложение могло удостовериться, что оно общается не с "левым" сервисом а именно тем, который был в конкретном WSDL. И чтобы Kerberos смог понять, что какая-то служба на конкретном порту/хосте ассоциируется с своим конкретным пользователем. Это почти не имеет отношения к авторизации клиента. Клиент просто должен указать в userPrincipalName такой же SPN, какой установлен у службы.
См. http://blogs.iis.net/brian-murphy-bo...palname-s.aspx http://www.osp.ru/win2000/2007/04/4315478/ А что касается вашей идеи о едином пользователе "трое из сервиса, одинаковы с лица", то это нужно делать несколько по-другому, в Аксе несколько другая концепция относительно того, чего вы хотите. Все направлено на сохранение identity пользователя, запустившего клиентское приложение. В общем-то, для того и настраивается delegation чтобы эта вот identity сохранилась на всем пути: Хост с клиентом -> WCF компонента (IIS) -> AOS. Соответственно, если вы хотите чтобы все пользователи под кем бы не подсоединялись к Аксовскому сервису, выглядели одним и тем же - то настройте в Аксе trusted delegation user, заведите в домене бесправную запись с заранее известным паролем (по типу .NET Proxy user), заведите его в Аксе и поставьте в соответствие этому trusted delegation user наряду с остальными пользвателями. Залейте в app.config клиента его имя/пароль, и пусть клиенты всегда соединяются с этим логином/паролем который вы в runtime будете присваивать Windows.ClientCredential. Вообще говоря, если кроме этого псевдопользователя никто со своими учетными данными к сервису ходить не будет, тогда можно и без trusted delegation - напрямую завести нашего бесправного пользователя в Аксе. Но фактически, это почти равносильно отсутствию пароля вовсе, т.к. пароль все равно доступен кому-то извне, пусть и зашитым в приложение-клиент. Кстати, если у вас появятся мысли о доступе вообще без пароля - имейте в виду, что Dynamics AX позволяет доступ без авторизации только к конечной точке по умолчанию. Для всех остальных точек нужно иметь другой тип привязки, чтобы иметь возможность указать конечную точку, а в любом из этих типов нужно указывать credentials. P.S. Кстати, попробуйте перед своим com.ClientCredentials.Windows.ClientCredential.UserName = ... поставить вывод текущего UserName и посмотрите что там лежит. Просто ради интереса.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... Последний раз редактировалось Maximin; 15.08.2012 в 18:22. |
|
16.08.2012, 12:31 | #7 |
MCTS
|
Общую идею понял, спасибо за ссылки и подробный ответ, буду дальше изучать.
Цитата:
P.S. Кстати, попробуйте перед своим com.ClientCredentials.Windows.ClientCredential.UserName = ... поставить вывод текущего UserName и посмотрите что там лежит. Просто ради интереса.
|
|
Теги |
.net, aif, ax2009, ax2012, service, web сервис, webservice |
|
|