J'appelle WCF à partir d'une page ASP.NET à l'aide d'ASP.NET Ajax. J'utilise l'authentification par formulaire pour sécuriser le site Web.Utilisation d'ASP.NET Ajax pour appeler WCF sur SSL
Tout fonctionnait comme prévu grâce au développement jusqu'à son déploiement sur le serveur de production, puis j'ai commencé à recevoir des erreurs JavaScript car le service était introuvable. Le serveur de production utilise SSL donc j'ajouté ce qui suit à mon web.config:
<webHttpBinding>
<binding name="webBinding">
<security mode="Transport" />
</binding>
</webHttpBinding>
Cela arrêté les erreurs JavaScript de se produire, mais maintenant le service WCF ne se comporte pas comme il utiliser pour. Avant de définir la sécurité sur Transférer un appel au service WCF à partir d'ASP.NET Ajax exécutera le Application_AuthenticateRequest
dans mon Global.asax. Cela permet de configurer un IPrinciple
personnalisé sur HttpContext.Current.User
en fonction du ticket d'authentification par formulaire. Le constructeur de mon service WCF définit Thread.CurrentPrinciple = HttpContext.Current.User
afin que mon service ait accès à l'ensemble IPrinciple
pendant Application_AuthenticateRequest
.
Après avoir changé la sécurité à Transport il ne semble pas courir Application_AuthenticateRequest
car mon Thread.CurrentPrinciple
n'est pas mon IPrinciple
personnalisé.
Est-ce que quelqu'un sait comment je peux obtenir le même comportement qu'avant en utilisant le transport comme après avoir utilisé le transport?
Ma page Web utilise ce qui suit pour référencer le service WCF:
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="
<Services>
<asp:ServiceReference Path="~/Services/MyService.svc" />
</Services>
</asp:ScriptManagerProxy>
Code utilisé dans mon 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);
}