当前位置:  开发笔记 > 编程语言 > 正文

WCF,ASP.NET成员资格提供程序和身份验证服务

如何解决《WCF,ASP.NET成员资格提供程序和身份验证服务》经验,为你挑选了1个好方法。

我编写了一个与WCF服务(BasicHttpBinding)通信的Silverlight 2应用程序.托管Silverlight内容的站点使用ASP.NET成员资格提供程序进行保护.我可以使用我的WCF服务中的HttpContext.Current.User.Identity.Name访问当前用户,并且我已打开AspNetCompatibilityRequirementsMode.

我现在想要使用完全相同的Web服务编写Windows应用程序.为了处理身份验证,我启用了身份验证服务,并且可以调用"login"来验证我的用户... Okey,一切都很好......但是我怎么能在我的其他服务客户端上设置身份验证cookie?!

两种服务都托管在同一个域中

MyDataService.svc < - 处理我的数据的那个

AuthenticationService.svc < - Windows应用程序必须调用以进行身份​​验证的那个.

我不想为Windows客户端创建新服务,或使用其他绑定...

客户端应用程序服务是另一种选择,但所有示例仅限于显示如何获取用户,角色和他的个人资料......但是,一旦我们使用客户端应用程序服务进行身份验证,就应该有办法获取该身份验证cookie在回调同一服务器时附加到我的服务客户端.

根据同事的意见,解决方案是添加一个wsHttpBinding终点,但我希望我可以解决这个问题......



1> Jonas Folles..:

我终于找到了一种方法来完成这项工作.对于身份验证,我正在使用" WCF身份验证服务 ".验证服务时将尝试设置身份验证cookie.我需要从响应中获取此cookie,并将其添加到对同一台计算机上的其他Web服务发出的任何其他请求中.执行此操作的代码如下所示:

var authService = new AuthService.AuthenticationServiceClient();
var diveService = new DiveLogService.DiveLogServiceClient();

string cookieHeader = "";
using (OperationContextScope scope = new OperationContextScope(authService.InnerChannel))
{
    HttpRequestMessageProperty requestProperty = new HttpRequestMessageProperty();
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty;
    bool isGood = authService.Login("jonas", "jonas", string.Empty, true);
    MessageProperties properties = OperationContext.Current.IncomingMessageProperties;
    HttpResponseMessageProperty responseProperty = (HttpResponseMessageProperty)properties[HttpResponseMessageProperty.Name];
    cookieHeader = responseProperty.Headers[HttpResponseHeader.SetCookie];                
}

using (OperationContextScope scope = new OperationContextScope(diveService.InnerChannel))
{
    HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty();
    OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest);
    httpRequest.Headers.Add(HttpRequestHeader.Cookie, cookieHeader);
    var res = diveService.GetDives();
}      

正如您所看到的,我有两个服务客户端,一个是身份验证服务,另一个是我实际要使用的服务.第一个块将调用Login方法,并从响应中获取身份验证cookie.第二个块将在调用"GetDives"服务方法之前将标头添加到请求中.

我根本不满意这个代码,我认为更好的选择可能是使用"Web Reference"而不是"Service Reference",而是使用.NET 2.0堆栈.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有