通过FormsAuthentication Cookie来WCF服务通过FormsAuthentic

2019-05-17 01:13发布

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

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

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

有任何想法吗?

Answer 1:

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

编辑:

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

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

为了确保这两个应用程序可以加密/解密窗体身份验证Cookie以同样的方式,你应该配置<machineKey>元素的两个应用程序(在取决于web.config文件或machine.config中是否要在机器或应用程序要做到这一点水平)。 你应该看看validationvalidationKeydecryptiondecryptionKey属性。

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

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

<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)

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



Answer 2:

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

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

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

然后装点每一个服务,你希望接受以下饼干

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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



文章来源: Passing FormsAuthentication cookie to a WCF service