Вызов действия MVC3 из хранимой процедуры SQL CLR - PullRequest
1 голос
/ 24 февраля 2012

Я работаю над хранимой процедурой CLR, которая вызывает действие контроллера в приложении ASP.NET MVC3, которое использует проверку подлинности Windows (все остальное отключено).Веб-сервер - IIS 7.5, работающий под управлением Windows Server 2008 R2 Standard.Сервер базы данных - SQL Server 2008 R2 Enterprise Edition.Вот код процедуры CLR:

[SqlProcedure]
public static void UpdateModels()
{
    Uri uri = null;
    HttpWebRequest rq;
    HttpWebResponse rsp;

    Uri.TryCreate("http://testserver/RPM/Configuration/UpdateModels", UriKind.Absolute, out uri);
    rq = (HttpWebRequest)HttpWebRequest.Create(uri);
    rq.Method = WebRequestMethods.Http.Get;
    rsp = (HttpWebResponse)rq.GetResponse();
}

Мне удалось без проблем развернуть сборку на SQL Server, но при ее запуске появляется следующая ошибка:

Msg 6522, Level 16, State 1, Procedure UpdateModels, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "UpdateModels": 
System.Net.WebException: The remote server returned an error: (401) Unauthorized.
System.Net.WebException: 
   at System.Net.HttpWebRequest.GetResponse()
   at StoredProcedures.UpdateModels()
.

Это происходит, когда я вызываю SP из задания агента SQL (запускаемого под моими учетными данными), когда я ВЫПОЛНЯЮ его из окна запроса SSMS (опять же, мои учетные данные) или любым другим методом, который я подумал попробовать.Я являюсь авторизованным пользователем веб-приложения и могу нормально вызывать этот метод контроллера из самого приложения.

Если я изменю URL-адрес на «http://testserver",, он будет работать нормально (конечно,ничего не делать), но если я добавлю «RPM» к URL-адресу, произойдет сбой, поэтому, похоже, проблема связана с самим приложением, а не с сервером или сайтом по умолчанию. Кроме того, если я включаю анонимную аутентификацию, это работаетТаким образом, каким-то образом учетные данные Windows не передаются на сайт. Проверка журнала подтверждает это:

2012-02-23 12:51:33 10.1.1.1 GET /RPM/Configuration/UpdateModels - 80 - 10.2.2.2- 302 0 0 218

Учетные данные не передаются. Я пытался использовать олицетворение в коде CLR SP, но этоне помогло. Как я уверен, это очевидно, я довольно новичок в этом деле и, вероятно, делаю что-то глупое. Если бы кто-то мог поставить меня на правильный курс, я был бы благодарен!

TIA

Джефф

1 Ответ

0 голосов
/ 28 февраля 2012

Ну, как я и боялся, я делал что-то глупое. Оказывается, олицетворение было ответом, но мне просто нужно было установить уровень олицетворения:

rq.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

перед вызовом метода GetResponse. После этого предоставленные учетные данные были переданы контроллеру MVC3, как я и ожидал.

Думаю, я опубликую это на тот случай, если кто-то еще будет бороться с этим так, как я.

Джеф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...