none
请教如何不使用证书? RRS feed

  • 常规讨论

  • 最近在看WCF安全方面的东东,也看了版主Frank的安全系列。
    有个疑问想请教一下,如何在局域网不使用证书,我也明白证书为了保护数据传送,可是当使用NetTcpBinding绑定,且在局域网中时,我认为就没必要使用证书。可惜我不知道如何写代码。

    我的服务器端代码如下(该代码会报未提供证书的错误):

    using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))
                {
                    NetTcpBinding m_NetTcpBinding = new NetTcpBinding();
                    m_NetTcpBinding.Security.Mode = SecurityMode.Message;
                    m_NetTcpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
                    host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
                    host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new MyUserNamePasswordValidator();                
                    host.AddServiceEndpoint(typeof(HelloIndigo.IHelloIndigoService), m_NetTcpBinding, "net.tcp://localhost:9000/HelloIndigo");
                    host.Open();                
                    Console.ReadLine();           
    }

    因为Transport安全模式不支持UserName的凭证,所以我改用了Message安全模式。可是一采用Message安全模式就报没有服务器证书的错误。(如上面的代码)
    请教大家如何修改上面的代码,使得在不使用证书的情况下可以使用。

    看到的资料都说局域网内使用Windows凭证,这个我也测试过没问题。可惜在实际应用中不能采用Windows来代替实际应用程序中的凭证。两者无法完美匹配。

    • 已更改类型 Jiyuan 2009年11月17日 14:53 没有想要的答案
    2009年11月14日 9:18

全部回复

  • NetTcpBinding+Windows凭证在啊局域网里不是绝佳的组合吗?
    呵呵
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月14日 16:45
    版主
  • 哈,Frank这么晚还没睡。

    因为通常的企业应用都有自己的凭证存储,不可能再单独在Windows上创建同样的帐户啊。
    2009年11月14日 16:49
  • 自定义凭据,自定义认证,自定义授权.
    2009年11月15日 2:22
  • 哈,Frank这么晚还没睡。

    因为通常的企业应用都有自己的凭证存储,不可能再单独在Windows上创建同样的帐户啊。

    hehe,是的啊~上来就看到你的帖子了。

    那你能使用WS规范吗?WCF分布式安全开发实践(3):传输安全模式之自定义用户名密码身份验证:Transport_UserNamePassword_WSHttpBinding
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月15日 7:12
    版主
  • 哈,Frank这么晚还没睡。

    因为通常的企业应用都有自己的凭证存储,不可能再单独在Windows上创建同样的帐户啊。

    hehe,是的啊~上来就看到你的帖子了。

    那你能使用WS规范吗?WCF分布式安全开发实践(3):传输安全模式之自定义用户名密码身份验证:Transport_UserNamePassword_WSHttpBinding
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum

    可以的,我用Transport_UserNamePassword_NetTcpBinding也可以。可问题是要先配置证书,总觉得没道理(我指在局域网中)。实施配置复杂,也会损耗性能。
    总觉得应该有个开关来关闭证书的使用。
    很奇怪WCF为何不支持Transport模式的UserName?没道理强制要求使用Windows验证啊。实际的企业应用不可能达到用户和角色与Windows的帐户和组相对应啊。
    迷惑中。。。
    2009年11月15日 10:03
  • 自定义凭据,自定义认证,自定义授权.

    您好,不好意思才看到。我自己试过了没成功。服务器上必须安装证书才能通过。能有代码例子参考一下吗?
    我的理解这个跟自定义的凭据和授权应该没关系,应该是在信息验证环节。还请赐教!多谢!
    2009年11月16日 8:33
  • Windows域帐号只能保证客户端和服务器的身份控制的有效性。
    但是不能够提供数据的加密也就是安全性的问题。
    局域网里传输模式实际的安全加密和解密的效率没有想象的那么差,局域网适合传输安全模式,SSL加密使用的也是对称加密算法。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月16日 10:25
    版主
  • 你好,

    为了安全性考虑用UserName的时候强制服务器端提供证书给客户端验证.如果你不想用证书, 可以考虑直接在头里面包含验证相关信息:

    void Main(string[] args)

    {

    Service1Client proxy = new ConsoleApplication1.ServiceReference1.Service1Client();

     

    MessageHeader<string> myHeader = new MessageHeader<string>("You can pass username here", false, "ns:MyServer", true);

     

    MessageHeader MyUntypedHeader = myHeader.GetUntypedHeader("HelloWorld", "ns");

     

    using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel))

     

    OperationContext.Current.OutgoingMessageHeaders.Add(MyUntypedHeader);

     

    Console.WriteLine(proxy.GetData(10));

     

    Console.ReadLine();

     

    }


    服务器端得到头上的信息:

    string content= OperationContext.Current.RequestContext.RequestMessage.Headers.GetHeader<string>("HelloWorld", "ns", "ns:MyServer");

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.
    2009年11月16日 10:32
    版主
  • Windows域帐号只能保证客户端和服务器的身份控制的有效性。
    但是不能够提供数据的加密也就是安全性的问题。
    局域网里传输模式实际的安全加密和解密的效率没有想象的那么差,局域网适合传输安全模式,SSL加密使用的也是对称加密算法。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum

    每次都要制作证书挺郁闷。
    2009年11月17日 5:12
  • To Allen:

        先谢谢您的回复,现在的问题是:如果我不制作证书就无法启动服务宿主。

    我的需求其实很简单:采用NetTcpBinding的绑定,然后在局域网内传送凭证。不希望制作证书,这样会增加实施的复杂度。
    我觉得我这个场景是很普遍的,为什么WCF不支持很郁闷。

    1、采用NetTcpBinding是因为在局域网有最好的传送性能。
    2、采用UserName是因为企业应用都有自己的凭证,只需要在服务间传递用户名和秘密或是凭证或是令牌即可。不可能使用Windows。我们无法保证客户的IT能将帐户和工作组配置的跟我们开发的企业应用的相同。
    3、不采用证书,因为小型的企业应用关键的服务组件都在局域网内它们之间的信息传递即使是明文的也无所谓,这样实施和性能都是最佳。

    而WCF的NetTcpBinding的Transport模式不支持UserName凭证,只有Message模式支持UseName凭证。为什么?
    这样也罢,但一使用Message就强迫使用证书,太不爽了,在局域网内不需要加密,个人认为使用证书只能作为默认值,应该有个开关能很方便的关闭。查了很多资料,感觉要自定义通道或是绑定才能实现,这太麻烦了。本就不是一个什么复杂的需求。
    2009年11月17日 5:30
  • 你好,

    出于安全性考虑密码肯定是要加密的,所以必须要有机制来加密,所以就需要证书.如果你不提供证书,就要想办法自己来加密解密来确保安全性. (或者特定情况下不加密)
    用NetTcpBinding+None security + MessageHeader 传递用户名密码,在服务器端用MessageInspector来检查soap头做验证就可以了.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.
    2009年11月17日 8:49
    版主
  • 你好,

    出于安全性考虑密码肯定是要加密的,所以必须要有机制来加密,所以就需要证书.如果你不提供证书,就要想办法自己来加密解密来确保安全性. (或者特定情况下不加密)
    用NetTcpBinding+None security + MessageHeader 传递用户名密码,在服务器端用MessageInspector来检查soap头做验证就可以了.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.

    您好,这样或许可以解决问题。但同时也无法使用WCF框架中其它的安全机制例如授权机制。
    虽然可以为Thread.CurrentPrincipal赋值从而使用.Net现有的基于角色的安全机制,但服务操作毕竟都是由WCF来调度,当调用完服务操作后我还找不到合适的地方去除Thread.CurrentPrincipal的值,这样就会产生类似我在http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/34a24b2b-8ab2-4a59-b0bd-63c269f300dc中提到的多用户问题。

    看来目前只有接受强制证书加密的方式了。
    2009年11月17日 14:52
  • 因为没有找到自己想要的答案,所以把当前问题改为讨论类型。

    谢谢大家了。如果有跳过证书的方法还请告知。谢谢!
    2009年11月17日 14:53
  • 1.服务和客户端都处于一个Windows域里,有域服务器提供客户端和服务端的身份验证。
    此种情况是不需要证书的。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月20日 12:03
    版主
  • 1.服务和客户端都处于一个Windows域里,有域服务器提供客户端和服务端的身份验证。
    此种情况是不需要证书的。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum

    哈,多谢Frank。你是不是指NetTcpBinding+Windows凭证?如果是无法满足自定义的凭证的需求。不知我理解是否有问题?
    能否提供简单的代码参考一下?
    看到你正在翻译的书,支持一下。一定拜读。
    2009年11月20日 16:18
  • 应该是。
    Windows域账户吧。
    NetTcpBinding绑定适合 局域网使用。
    我记得 这个也是NetTcpBinding 安全默认的客户端身份验证方式。
    the netTcpBinding binding with Windows authentication and transport security.
    netTcpBinding is used for communicating with WCF clients in an intranet environment and provides transport security and Windows authentication by default


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月21日 4:38
    版主
  • 1.服务和客户端都处于一个Windows域里,有域服务器提供客户端和服务端的身份验证。
    此种情况是不需要证书的。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum

    哈,多谢Frank。你是不是指NetTcpBinding+Windows凭证?如果是无法满足自定义的凭证的需求。不知我理解是否有问题?
    能否提供简单的代码参考一下?
    看到你正在翻译的书,支持一下。一定拜读。
    谢谢支持,呵呵~

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月21日 5:02
    版主
  • 应该是。
    Windows域账户吧。
    NetTcpBinding绑定适合 局域网使用。
    我记得 这个也是NetTcpBinding 安全默认的客户端身份验证方式。
    the netTcpBinding binding with Windows authentication and transport security.
    netTcpBinding is used for communicating with WCF clients in an intranet environment and provides transport security and Windows authentication by default


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum

    哈,这样会有问题的。因为我们无法保证客户的IT能将帐户和工作组配置的跟我们开发的企业应用的相同。
    2009年11月21日 11:11
  • 不一定账户相同,能在同一个域里就可以。
    另外一个WCF不需要证书的安全模式是:TransportCredentailOnly,这个是用http明文传输客户端凭据。
    不需要https建立SSL连接。
    所有和你匹配的方式基本都不需要设置证书,但是数据安全性不被保护。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月23日 15:34
    版主
  • 多谢Frank,这种情况我明白的,就是总觉得达不到最理想的状态。
    最近调成功联合安全,真是不易,感觉这几天头脑都被安全充满,好在基本能理清一些概念。
    2009年11月25日 8:10