Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Имперсонация и делегирование asp.net проекта / 2 сообщений из 2, страница 1 из 1
16.07.2015, 21:00
    #39009295
paranamix2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имперсонация и делегирование asp.net проекта
Всем доброго времени суток. Возможно данный вопрос стоит адресовать специалистам в области asp.net, тем не менее он ощутимо затрагивает настройку SQL SERVER.

Наша компания занимается разработкой многослойного приложения, включающего в себя:
- Desktop клиент;
- Web APi сервер приложений. - AppServer
- БД, развернутая на MS SQL Server

Клиентское приложение практически выполняет функцию отображения (wpf мордочка), обработка данных из БД и также бизнес логика реализованы в AppServer. Некоторая сложная логика, включающая множество join операций вынесена на уровень БД в функции и хранимые процедуры и клиент обращается к ним напрямую (в тех местах, где "проседает" производительность по времени).

Идея взаимодействия такова: пользователь работает с клиентом под своей доменной учетной записью (не силен в данном вопросе, но знаю, что все учетки, а также их права хранятся на уровне БД, + Active directory). Пользователь обращается к AppServer, к примеру хочет отобразить некие данные в таблице. AppServer соответственно делает запрос к БД и вытаскивает нужные данные.

НО! Важно, чтобы AppServer выполнял этот запрос от имени учетки пользователя, который работает с клиентом, в противном случае политика раздачи прав на объекты в БД не имеет смысла. Т.е. нужно реализовать механизм "сквозной авторизации" на SQL Server через AppServer.

Поиски решения привели к понятиям имперсонации и делегирования в asp.net проекте и к данной статье в частности:
http://blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation/

сделал соответствующие настройки в web.config, установил в IIS Negotiate:Kerberos и убрал Kernel-mode authentification, админ соответственно настроил соответствующим образом Active Directory, установив "Trust this computer for delegation to any service", то есть, по сути, сделал делегирование enable.

Пытаюсь проверить работоспособность делегирования через тестовый проектик: создал Web API проект, добавил тестовый метод со следующим кодом:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
string userName = "";
            string userId = "";

            if (HttpContext.Current != null && HttpContext.Current.User != null &&
                HttpContext.Current.User.Identity.Name != null)
            {
                userName = HttpContext.Current.User.Identity.Name;
                userId = HttpContext.Current.User.Identity.AuthenticationType;
            }

            return userName;



чтобы проверить, авторизован ли я на сервисе, и запаблишил этот сервис

Учетку из http контекста данный метод возвращает верно, то есть я делаю вывод, что на сервисе я авторизован. Далее я делаю тестовый метод для обращения к sql server к нужной базе, данный метод должен вернуть suser_sname:

Код: c#
1.
2.
3.
4.
5.
6.
SqlConnection conn = new SqlConnection("Data Source=SERVER;Initial Catalog=Database;Integrated Security=True");
            conn.Open();
            SqlCommand com = new SqlCommand("SELECT SUSER_SNAME()", conn);
            var result = (string)com.ExecuteScalar();

            return result;



Обращаюсь в браузере к контроллеру: http://.../api/values
В результате я получаю такую ошибку:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
</ExceptionMessage>
<ExceptionType>System.Data.SqlClient.SqlException</ExceptionType>
<StackTrace>
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.Open() at TestWebApi.Controllers.ValuesController.Get() at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
</StackTrace>
</Error>



Поиск в гугл приводит меня к одним и тем же ссылкам, в которых указываются настройки, которые уже установлены. Я почти уверен, что проблема где-то в настройках IIS или Active Directiry, но к сожалению пока-что решение не найдено.

Возможно кто-то решал схожую задачу либо сталкивался с такой проблемой. Буду очень благодарен Вам за помощь!

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
17.07.2015, 12:12
    #39009723
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имперсонация и делегирование asp.net проекта
paranamix2,
Проверьте что установлено в Identity в Application Pool.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Имперсонация и делегирование asp.net проекта / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]