我有一个网站,与一个远程WCF Web服务。两者都使用相同的自定义FormsAuthentication提供。我愿与WCF服务冒充当前登录网站的用户进行身份验证。我已经手动这样做,使用用户名客户端凭据,但我需要知道用户密码。 那么,什么工程,以便放屁是这样的:通过身份验证的用户发出请求,我创建了一个服务客户端,并设置自己的凭据:

serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;

但我真正想要的是直接通过FormsAuthentication饼干,因为我不想存储用户密码做。

任何想法?

有帮助吗?

解决方案

这听起来像你正在寻找的 Windows通信基础认证服务

修改

在重新阅读的问题更仔细(和Ariel的评论之后)我想收回上述建议。 WCF的认证服务将不会增加太多的这种情况。

我没有做过这个WCF和ASP.NET之间,但是我已经配置ASP.NET应用程序共享形式的身份验证的用户,或许我可以以某种方式帮助。

要确保这两个应用程序可以加密/解密的形式以同样的方式验证cookie,你应该的(具体取决于您是否想这样做在机器或应用水平在web.config中或machine.config中)配置两个应用程序<machineKey>元素。你应该看看validationvalidationKeydecryptiondecryptionKey属性。

确保在这两个web.config文件中的<forms>元件被类似地配置。具体地,namepathdomain属性。

这可能是因为这仅适用于传递到/从Web浏览器的cookies(但可能是在这种情况下很有用):要允许Cookie的传递之间的网站的 www.foo.com 的和 bar.foo.com 的需要按如下允许Cookie,才能在一个网站上设置并成功通过其他配置forms元素:

<forms ... domain=".foo.com" ... />

传递cookie来WCF服务很可能是棘手的位。我不是很有经验的WCF,所以我从kennyw.com 改编代码:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>");

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel))
{
  OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
  serviceClient.MethodName();
} 

如果你IIS(而不是自托管)内托管WCF可以通过设置穿过ASP.NET处理流水线的WCF请求

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>

如果你是自托管,你可以在使用OperationContext.Current.IncomingMessageProperties传入消息的属性检查请求头,并得到窗体身份验证Cookie值,并使用的 FormsAuthentication.Decrypt(string)

我不知道是否有任何这会工作,但会喜欢听到的话,它确实!

其他提示

这是很简单,如果你的主机通过身份验证的IIS站点内的WCF服务做的。

通过添加以下到您system.ServiceModel部在你的web.config启用兼容性

<system.serviceModel>  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel>

然后装点每个服务要接受与cookie以下

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

现在的HttpContext.Current.User.Identity对象将被正确地填充,也可以使用PrinciplePermission要求通过角色或特定用户来限制访问。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top