问题标签 [wcf-security]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4066 浏览

.net - 如何:具有传输安全性+服务器证书身份验证的 WCF。没有客户证书?

我是否正确理解可以使用“传输安全性”、“证书身份验证”设置 WCF 服务并且没有安装“客户端证书”客户端?

我的情况是:

  • 远程服务器上的 WCF 服务
  • Windows Forms 客户端可能向数百名用户发送(验证用户(针对 DB)并通过 WCF 服务方法执行操作)

我希望我的消息通过 SSL 加密,这就是我选择“传输”方法的原因,我相信为什么我还需要服务器证书。

我遵循了一个演练,它给了我以上所有内容,但包括安装客户端证书的必要性?如果我将此 Windows 窗体应用程序发送给客户,如果我被迫要求他们如何安装证书?似乎我在这里遗漏了一个重要点,因为我认为将证书安装到用户机器上将是一个很大的问题。

PS。可能从我在这里阅读的内容来看,我手头的任务是否过于复杂?我是否只需要在我们的 Web 服务器中安装 SSL 证书并通过 HTTPS 访问 WCF 服务,并且可能只需要使用 basicHttpBinding?实际上不需要担心“证书认证”机制?

0 投票
6 回答
30909 浏览

wcf - 使用支持流的 basicHttpBinding 保护 WCF 服务

我的问题是关于保护对仅对我们公司内部用户公开的 WCF 服务的访问的最佳(又称“最不痛苦”)方法。目标是确保仅通过我们每个用户安装的单个 Windows 窗体应用程序访问该服务。当服务被调用时,我希望服务能够验证它是从允许的应用程序中调用的。

要保护的服务使用支持流的basicHttpBinding,所以我相信我仅限于传输级别的安全性。

以下是我的服务配置文件中的<bindings>和部分的简化版本。<services>

谁能提供一些详细信息,说明我需要采取哪些措施才能在此服务上实施安全性?

注意:我是 WCF 新手,完全不熟悉安全性,所以如果我没有提供足够的详细信息,请告诉我。


更新:

正如marc_s 所建议的,我想使用某种用户名/密码机制来保护 WCF 服务。这为答案提供了更多方向,但我对如何实际执行此操作仍然有些模糊。

因为我的服务需要启用流式传输,所以我必须使用 basicHttpBinding 和传输级安全性(对吗?);此外,我的服务中包含的方法只能接受 Stream 对象。

考虑到这些限制以及我使用用户名/密码验证的偏好......

  • 我应该如何修改我的服务的配置文件以强制提供用户名/密码凭据?
  • 我的服务将如何验证提供的凭据?
  • 我的客户端应用程序在拨打电话时如何将凭据传递给服务?
  • 这是否需要使用 SSL,如果需要,所有客户端机器是否也需要证书?

更新:

在向我的老板解释了我在保护这项服务方面遇到的麻烦之后,我被允许尝试 Windows 身份验证路由。可悲的是,我在使用我的 Streamed 服务 (argh) 实现这种类型的身份验证时没有运气。在进行适当的更改(如此所述- 唯一的例外是 my transferMode="Streamed")并访问我的服务后,我收到以下错误:

HTTP 请求流不能与 HTTP 身份验证结合使用。禁用请求流式传输或指定匿名 HTTP 身份验证。

然后,我在这里偶然发现了以下引用,它提供了一些说明:

您不能进行传输身份验证。与流媒体。如果必须使用 HTTP 请求流,则必须在没有安全性的情况下运行。

安全工作的方式是:

WCF 客户端向服务器发出 http 请求。

服务器回应说,“你没有被授权,给我一个基本/摘要/等凭证。”

客户端收到该响应并重新发送带有附加凭据的消息。

现在服务器收到消息,验证凭据,然后继续。请求流不是为使用该安全模式而设计的。如果是这样,那将非常慢,因为客户端将发送整个流,从服务器获取未授权的消息,然后它必须重新发送带有凭据的整个流。

所以现在我正在寻找意见,您将如何保护启用流式传输的 WCF 服务?如前所述,某种用户名/密码机制将是首选。随意在这个盒子外面思考......

非常感谢任何帮助!

0 投票
1 回答
2698 浏览

wcf - WCF 获取“必须加密主签名”。来自具有 ProtectionLevel.None 的 FaultContract

我有一个现有的 asp.net 应用程序,它与负载平衡的 wcf 服务(iis 托管,在配置为 servicePrincipalName 的帐户下运行的应用程序池等)对话。wcf 服务返回一些自定义错误,全部使用 FaultContract(typeof(x), ProtectionLevel = ProtectionLevel.None) 定义——这些服务不向公众公开。客户端使用“服务引用”生成的类来访问服务。

这工作正常,但现在,使用最新的代码库,我们得到“必须加密主签名”。当服务返回这些故障之一时,客户端上的异常。服务代码和配置没有改变(至少是产生故障的遗留部分)。客户端服务参考生成的代码似乎变化最大(它经常被删除并重新创建)。

安全配置一年多没有变化。所有更新都是最新的。我们已经在三个环境中对此进行了测试,一旦我们部署了新的代码库,错误就会开始产生异常。似乎它必须在生成的类中,但它们是由 Visual Studio 生成的,因此非常令人困惑。

这听起来很熟悉吗?有什么建议么?

更新:删除 ProtectionLevel 属性并允许它默认会使问题“消失”,但我很好奇为什么指定 None 会导致它失败。也许它与运营合同或服务合同的默认级别冲突,但这些值在过去一年中没有改变,所以这并不能解释为什么现在有效的东西没有改变。

更新:对于它的价值,代码生成的这种变化发生在 2.0.50727.3053 和 2.0.50727.3082 之间(根据生成代码中的运行时版本注释)。

0 投票
1 回答
1555 浏览

asp.net - 通过 Web 应用程序基于 WCF 表单的身份验证 - 传递凭据

我有一个简单的 Web 服务,通过基于表单的身份验证来处理安全性。

我正在通过网络应用程序访问它。所以我想做一次以上但为了安全/性能不必再做一次。我在想像下面这样的事情,但是当我使用 FormsAuthentication 时,这将不起作用...

0 投票
1 回答
2184 浏览

wcf - Silverlight WCF 身份验证(帮助从 WPF 到 Silverlight)

我有一个现有的工作 WPF 应用程序,我在其中实现了我自己对后端 WCF 服务的自定义身份验证。当我从 WPF 访问此服务时,按如下方式设置 ServiceProxy:

因为我使用的是 HTTPS,所以 uid/pwd 是安全的。

在 Silverlight 2 中,代理上没有 .ClientCredentials 对象。我发现的唯一选择是将两个字符串参数添加到 Uid/Pwd 的 EVERY WCF Exposed 方法中。这对我来说听起来很疯狂,一定有更好的方法,不是吗?

0 投票
3 回答
438 浏览

.net - Silverlight asp.net WCF 身份验证 2.0

谁能提供一些关于设置 Silverlight 2.0 以通过 ASP.NET 表单身份验证对 WCF 服务进行身份验证的良好信息的链接?

0 投票
2 回答
2296 浏览

wcf - 在 IIS 5.0 下运行的 WCF 客户端与 Windows 2008 上的服务器出错

我有一个在 Windows 2008 机器上的 IIS 7 下运行的 .Net 3.5 SP1 WCF 服务。当我尝试从在 IIS 5.0 (Windows XP) .Net 3.5 SP1 下运行的 IIS 托管 WCF 服务连接到此服务时,我收到以下错误:

令牌提供程序无法获取目标令牌:http://( WCF 服务的 URL)

我构建了一个简单的控制台应用程序,它可以使用完全相同的配置成功连接到 WCF 服务。我还在 WebDev 服务器(Visual Studio 2008 附带的 ASP.Net 服务器)下构建了一个简单的 Web 应用程序,它能够成功连接到 WCF 服务。当我在 IIS (Windows XP) 中配置一个虚拟目录以指向与 WebDev 服务器相同的目录时,我收到以下错误:

安全包中没有可用的凭据

但是,如果我将 web.config 设置为使用我的登录凭据打开模拟,它就可以正常工作。由于显而易见的原因,这不是一个好的长期解决方案。我注意到 IIS 和 WebDev 服务器之间的一个区别是每个进程在其下运行的用户。IIS 在 ASPNet 帐户下运行,WebDev 在我的帐户下运行。

这是客户端上 WCF 部分的配置:

这是服务器配置(根据要求):

关于这个错误的原因有什么想法吗?

谢谢!

0 投票
4 回答
29818 浏览

c# - WCF Web 服务中的安全上下文令牌无效或过期

全部,

我有一个使用服务帐户(VM,Windows 2003 SP2)在 IIS 下托管的 WCF Web 服务(我们称为服务“B”)。该服务公开了一个使用默认值的 WSHttpBinding 的端点,除了 maxReceivedMessageSize、maxBufferPoolSize、maxBufferSize 和一些已增加的超时。

Web 服务已使用 Visual Studio 负载测试框架对大约 800 个并发用户进行了负载测试,并成功通过了所有测试,没有引发异常。单元测试中的代理是从配置中创建的。

有一个 sharepoint 应用程序使用 Office Sharepoint Server Search 服务来调用 Web 服务“A”和“B”。应用程序将从服务“A”获取数据以创建将发送到服务“B”的请求。来自服务“B”的响应被编入索引以供搜索。代理是使用 ChannelFactory 以编程方式创建的。

当服务“A”花费不到 10 分钟时,对服务“B”的调用成功。但是,当服务“A”需要更多时间(约 20 分钟)时,对服务“B”的调用会引发以下异常:

异常消息:从另一方收到不安全或不正确安全的故障。有关故障代码和详细信息,请参见内部 FaultException 内部异常消息:无法处理消息。这很可能是因为操作 'namespace/OperationName' 不正确,或者因为消息包含无效或过期的安全上下文令牌,或者因为绑定之间存在不匹配。如果服务由于不活动而中止通道,则安全上下文令牌将无效。为了防止服务过早中止空闲会话,请增加服务端点绑定的接收超时。

绑定设置相同,客户端服务器和 Web 服务服务器的时间与 Windows 时间服务同步,时区相同。

当我查看托管 Web 服务“B”的服务器时,我可以看到正在记录以下安全错误:

资料来源:安全

类别:登录/注销

事件编号:537

用户 NT AUTHORITY\SYSTEM

登录失败:

原因:登录时出错

登录类型:3

登录过程:Kerberos

身份验证包:Kerberos

状态码:0xC000006D

子状态码:0xC0000133

在网上看了一些博客后,状态码表示STATUS_LOGON_FAILURE,子状态码表示STATUS_TIME_DIFFERENCE_AT_DC。但我已经检查了服务器和客户端时钟,它们是同步的。

我还注意到安全令牌似乎缓存在客户端服务器的某个位置,因为它们有另一个进程使用相同的服务帐户调用 Web 服务“B”并在第一次调用时成功获取数据。然后他们开始更新办公室共享点服务器搜索服务索引的过程,但它失败了。然后,如果他们再次调用第一个进程,它也会失败。

有没有人遇到过此类问题或有任何想法?

问候,

——达米安

0 投票
2 回答
263 浏览

wcf-security - 我的 ASP.net 应用程序和 WCF 服务之间是否需要安全性?

[我知道这是相当主观的,并且取决于各种考虑,所以我只是整理一下想法,看看人们对这个主题的看法,以及他们正在考虑什么......]

我们有一个公开暴露的 asp.net 应用程序(需要用户名/密码验证),它反过来在后面使用一组 WCF 服务。

我正在尝试决定为这些服务使用哪个绑定,更具体地说 - 我们应该使用哪些安全元素(如果有的话)。

所有应用程序(Web 前端和所有服务)都驻留在防火墙后面的同一个服务器场上,这会阻止除 Web 应用程序之外的所有对服务的访问。在这种情况下——你会说没有任何安全元素是可以接受的吗(因此,大概,提高了性能?)

为了完整起见,我会说我们确实希望在某些时候在外部公开一些服务,但这将通过具有不同地址的不同端点来完成,使用包括联合身份在内的高安全性元素进行身份验证

0 投票
2 回答
2196 浏览

wcf - 如何从 WCF 客户端应用程序中的 UserNamePasswordValidator 捕获异常?

我使用 netTcpBinding 和安全模式="Message" 和 clientCredentialType="UserName" 编写了简单的 WCF 服务。当我传递有效的用户名和密码时,一切正常,会话以我想要的方式建立。但是,当凭据错误时,尽管我无法在 try catch 块中的客户端应用程序中捕获它,但会引发异常。有没有人有同样的问题?这是我的自定义验证器...