我最近编写了一个与Silverlight一起使用的Web服务,它使用ASP.net成员资格和角色。
要验证服务中的客户端,我查看HTTPContext.Current.User(当从Silverlight调用服务时可以工作)
但是,我一直试图从asp.net回发中调用相同的服务。但是,当我逐步进入服务时,HTTPContext.Current有一个用户名的emplty字符串。
我猜我在web.config文件中没有做的事情导致httpContext没有通过代理发送到我的服务?
任何想法都将不胜感激。我需要能够以某种方式使用asp.net成员资格和角色来验证客户端,并让它在asp.net客户端和Silverlight客户端上运行。
答案 0 :(得分:2)
我已经解决了!
默认情况下,Silverlight应用程序将所有浏览器cookie发送到服务。其中一个cookie是“.ASPXAUTH”cookie,用于对成员资格和角色进行身份验证。
然而,asp.net应用程序没有将cookie发送到服务。要发送授权cookie,我在调用我的webservice方法之前使用了以下代码。
using (OperationContextScope scope = new OperationContextScope(ws.InnerChannel))
{
HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty();
OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest);
HttpCookieCollection cc = Page.Request.Cookies;
if (Request.Cookies[".ASPXAUTH"] != null)
{
HttpCookie aCookie = Request.Cookies[".ASPXAUTH"];
String authcookieValue = Server.HtmlEncode(aCookie.Value);
httpRequest.Headers.Add("Cookie: " + ".ASPXAUTH=" + authcookieValue);
}
// Webservice call goes here
}
答案 1 :(得分:1)
而不是HTTPContext尝试ServiceSecurityContext.Current.PrimaryIdentity
答案 2 :(得分:0)
不确定它是如何使用Silverlight而不是ASP.Net,但对于初学者来说这是一个很好的blog post on how to setup WCF to work with ASP.Net membership providers。有很多步骤,所以这可能很容易错过设置。
一旦你正确地工作,我想两者都应该正常工作。
答案 3 :(得分:0)
我想这可能是因为我的wcf服务在我的silverlight.web项目中,并且在共享方面它们可能更友好。
我可能需要阅读更多有关wcf的内容,并通过建立单独的Web服务项目来创建更大的关注点?
答案 4 :(得分:0)
更新
好的,我已经看过使用Fiddler的HTTP Post请求
看起来Silverlight应用程序正在发送带有授权cookie的“状态”而我的asp.net应用程序不是。
我打电话给服务时看起来需要发送状态+我的授权cookie。我可能需要尽快提出一个新问题......