从SQL CLR存储过程调用MVC3操作

时间:2012-02-23 23:09:18

标签: asp.net-mvc-3 sqlclr

我正在研究一个CLR存储过程,该过程在使用Windows身份验证的ASP.NET MVC3应用程序中调用控制器操作(其他一切都被禁用)。 Web服务器是在Windows Server 2008 R2 Standard上运行的IIS 7.5。数据库服务器是SQL Server 2008 R2 Enterprise Edition。这是CLR proc的代码:

[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()
.

当我从SQL代理作业调用SP(在我的凭据下运行),从SSMS查询窗口(再次,我的凭据)或我认为尝试的任何其他方法执行它时,会发生这种情况。我是Web应用程序的授权用户,能够从应用程序本身调用该控制器方法。

如果我将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 :(得分:0)

好吧,正如我所担心的,我正在做一些愚蠢的事情。结果模仿的答案,但我只需要设置模拟级别:

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

在调用GetResponse方法之前。在这之后,提供的凭据就像我原先预期的那样传递给MVC3控制器。

以为我会发布这个以防万一其他人像我一样挣扎。

杰夫