通过FormsAuthentication Cookie来WCF服务
-
23-08-2019 - |
题
我有一个网站,与一个远程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>
元素。你应该看看validation
,validationKey
,decryption
和decryptionKey
属性。
确保在这两个web.config文件中的<forms>
元件被类似地配置。具体地,name
,path
和domain
属性。
这可能是因为这仅适用于传递到/从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要求通过角色或特定用户来限制访问。