我正在使用 ASP.NET Ajax 从 ASP.NET 页面调用 WCF。我正在使用表单身份验证来保护网站。
在开发过程中一切都按预期工作,直到它被部署到生产服务器上,然后我开始收到 JavaScript 错误,因为找不到该服务。生产服务器使用 SSL,所以我在web.config中添加了以下内容:
<webHttpBinding>
<binding name="webBinding">
<security mode="Transport" />
</binding>
</webHttpBinding>
这阻止了 JavaScript 错误的发生,但现在 WCF 服务的行为不像以前那样。
在将安全设置为传输之前,从 ASP.NET Ajax 调用 WCF 服务将Application_AuthenticateRequest
在我的 Global.asax 中执行。这将基于表单身份验证票设置自IPrinciple
定义HttpContext.Current.User
。我的 WCF 服务的构造函数集Thread.CurrentPrinciple = HttpContext.Current.User
,因此我的服务可以IPrinciple
在Application_AuthenticateRequest
.
将安全性更改为 Transport 后,它似乎没有运行,Application_AuthenticateRequest
因为 my Thread.CurrentPrinciple
is not my custom IPrinciple
。
有谁知道我如何获得与使用 Transport 之前和使用 Transport 之后相同的行为?
我的网页使用以下内容来引用 WCF 服务:
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="
<Services>
<asp:ServiceReference Path="~/Services/MyService.svc" />
</Services>
</asp:ScriptManagerProxy>
我的代码中使用的Application_AuthenticateRequest
:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
String cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (authCookie == null)
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch
{
return;
}
if (authTicket == null)
{
return;
}
HttpContext.Current.User = new CustomPrinciple(authTicket.Name);
}