【问题标题】:Passing FormsAuthentication cookie to a WCF service将 FormsAuthentication cookie 传递给 WCF 服务
【发布时间】:2010-11-08 09:44:50
【问题描述】:

我有一个与远程 WCF Web 服务通信的网站。两者都使用相同的自定义 FormsAuthentication Provider。我想使用模拟当前登录站点的用户的 WCF 服务进行身份验证。我已经使用 UserName 客户端凭据手动完成了此操作,但我需要知道用户密码。 所以,目前最有效的是:经过身份验证的用户发出请求,我创建一个服务客户端并设置他的凭据:

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

但我真正想要的是直接传递FormsAuthentication cookie,因为我不想存储用户密码。

有什么想法吗?

【问题讨论】:

  • 你好,爱丽儿,你最近玩的怎么样?我认识有类似问题的人。

标签: asp.net wcf forms-authentication wcf-security


【解决方案1】:

听起来您正在寻找Windows Communication Foundation Authentication Service

编辑:

在更仔细地重新阅读了这个问题之后(以及在 Ariel 的评论之后),我想撤回上述建议。 WCF 身份验证服务不会为这种情况添加太多内容。

我还没有在 WCF 和 ASP.NET 之间这样做,但是我已经配置 ASP.NET 应用程序来共享经过身份验证的用户的表单,也许我可以提供一些帮助。

为确保两个应用程序可以以相同的方式加密/解密表单身份验证 cookie,您应该为两个应用程序 configure the <machineKey> element(在 web.config 或 machine.config 中,具体取决于您是要在机器上还是应用程序上执行此操作)等级)。您应该查看validationvalidationKeydecryptiondecryptionKey 属性。

确保两个 web.config 文件中的 <forms> 元素配置相似。特别是namepathdomain 属性。

这可能仅适用于传入/传出网络浏览器的 cookie(但在这种情况下可能有用):允许 cookie 在网站 www.foo.combar.foo.com 您可以按如下方式配置 forms 元素,以允许在一个站点上设置 cookie 并成功传递给另一个站点:

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

将 cookie 传递给 WCF 服务可能是一个棘手的问题。我对 WCF 不是很有经验,所以I've adapted code from 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) 对其进行解密。

我不知道这是否可行,但很想听听是否可行!

【讨论】:

  • 我看不出身份验证服务有什么帮助。我的场景是这样的:用户-> 网站A-> WCF 服务B 托管在其他地方用户登录到A,A 使用用户凭据调用B。您将在哪里添加身份验证服务?
  • 嗨,爱丽儿。抱歉,我试图回答太快而没有真正阅读您的问题。我将通过更新对其进行编辑。
  • 感谢您的建议,我会尝试并在这里分享结果。
【解决方案2】:

如果您在经过身份验证的 IIS 站点中托管 WCF 服务,这很简单。

通过将以下内容添加到 web.config 中的 system.ServiceModel 部分来启用兼容性

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

然后用以下内容装饰您希望接受 cookie 的每个服务

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

【讨论】:

  • 嗯,这就是问题所在,我不能使用相同的 IIS。我正在构建的系统的一个要求是将网站和服务托管在不同的机器上。我正在考虑使用共享令牌,但我使用 Forms 是实现来自 ASP.net 的最简单的解决方案。
  • 啊草皮!您至少可以将它们放在同一个域名上吗?如果是这样,您可以设置表单身份验证 cookie 范围并以这种方式共享它。
  • 我认为是这样,应用程序将托管在单个根域下的 Intranet 中。我们也可以设置相同的机器密钥,但请记住用户正在访问网站,并且网站使用 WCF 作为模拟用户的数据源。它适用于 Windows 身份验证,但传递 FormsAuthentication cookie 是另一回事。我会尝试 darom 建议(或任何其他可用的)。
  • 吹牛,只是想让你知道,虽然这个回复没有回答发帖者的问题,但它回答了我的问题。感谢您没有删除它!
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多