我正在研究一个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,
杰夫
答案 0 :(得分:0)
好吧,正如我所担心的,我正在做一些愚蠢的事情。结果模仿是的答案,但我只需要设置模拟级别:
rq.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
在调用GetResponse
方法之前。在这之后,提供的凭据就像我原先预期的那样传递给MVC3控制器。
以为我会发布这个以防万一其他人像我一样挣扎。
杰夫