我有一个网站,与一个远程WCF Web服务。 两者都使用相同的自定义FormsAuthentication提供。 我愿与WCF服务冒充当前登录网站的用户进行身份验证。 我已经手动这样做,使用用户名客户端凭据,但我需要知道用户密码。 那么,什么工程,以便放屁是这样的:通过身份验证的用户发出请求,我创建了一个服务客户端,并设置了他的证件:
serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;
但我真正想要的是直接通过FormsAuthentication饼干,因为我不想存储用户密码做。
有任何想法吗?
这听起来像你正在寻找Windows通信基础认证服务 。
编辑:
在重新阅读的问题更仔细地(后沙龙的评论)我想收回上述建议。 WCF的认证服务将不会增加太多的这种情况。
我没有做过这个WCF和ASP.NET之间,但是我已经配置ASP.NET应用程序共享身份验证的用户的形式,也许我可以以某种方式帮助。
为了确保这两个应用程序可以加密/解密窗体身份验证Cookie以同样的方式,你应该配置<machineKey>
元素的两个应用程序(在取决于web.config文件或machine.config中是否要在机器或应用程序要做到这一点水平)。 你应该看看validation
, validationKey
, decryption
和decryptionKey
属性。
确保您<forms>
在两者的web.config文件元件被类似地配置。 具体的name
, path
和domain
属性。
这可能是因为这仅适用于传递到/从Web浏览器的cookies(但可能是在这种情况下很有用):要允许网站www.foo.com和bar.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)
。
我不知道是否有任何这会工作,但会喜欢听到的话,它确实!
这是很简单,如果你的主机通过身份验证的IIS站点内的WCF服务做。
在你的web.config添加以下到您system.ServiceModel部分启用兼容性
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
然后装点每一个服务,你希望接受以下饼干
[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
现在HttpContext.Current.User.Identity对象将被正确地填充,也可以使用PrinciplePermission要求通过角色或特定用户来限制访问。