none
关于WCF分布式安全开发实践(2):传输安全模式之基本身份验证(Windows账户密码)的几个问题 RRS feed

  • 问题

  • 版主您好:
                最近一直在学习您的WCF系列文章,今天看到基本身份验证(Windows账户密码)有很多问题,希望您在百忙之中给我解答一下。
                1.服务端配置文件:您在播客中写的是<transport clientCredentialType="Basic"/>但是在您的代码中写的是<transport clientCredentialType="Windows"/>,这个我有点不太明白,到底是哪个正确,还是他们都是可以实现的。
                2.客户端设置用户名密码:您在播客中写的是wcfServiceProxy.ClientCredentials.UserName.UserName = "Administrator",但是在您的代码中写的是wcfServiceProxyHttp.ClientCredentials.Windows.ClientCredential.UserName = "frank.xu"请问这两个有什么区别?
                3.绑定协议:您在播客中使用的是wsHttpBinding而代码中使用的是basicHttpBinding,这个我也不太明白。
                4.我在做这个例子时如果使用使用Basic模式时,就会出现异常:客户端身份验证方案“Basic”禁止 HTTP 请求。请问应该怎么解决呢?如果我使用Windows模式,那么我如果不设置用户名密码和域就可以运行成功,但是只要设置了就会出现异常:HTTP 请求未经客户端身份验证方案“Negotiate”授权。从服务器收到的身份验证标头为“Negotiate”。请问应该怎么解决?
                 谢谢您!
                 我是使用一台电脑运行的程序,和这个有关系么?
    2009年10月19日 13:38

答案

  • 版主您好:
                最近一直在学习您的WCF系列文章,今天看到基本身份验证(Windows账户密码)有很多问题,希望您在百忙之中给我解答一下。
                1.服务端配置文件:您在播客中写的是<transport clientCredentialType="Basic"/>但是在您的代码中写的是<transport clientCredentialType="Windows"/>,这个我有点不太明白,到底是哪个正确,还是他们都是可以实现的。
                2.客户端设置用户名密码:您在播客中写的是wcfServiceProxy.ClientCredentials.UserName.UserName = "Administrator",但是在您的代码中写的是wcfServiceProxyHttp.ClientCredentials.Windows.ClientCredential.UserName = "frank.xu"请问这两个有什么区别?
                3.绑定协议:您在播客中使用的是wsHttpBinding而代码中使用的是basicHttpBinding,这个我也不太明白。
                4.我在做这个例子时如果使用使用Basic模式时,就会出现异常:客户端身份验证方案“Basic”禁止 HTTP 请求。请问应该怎么解决呢?如果我使用Windows模式,那么我如果不设置用户名密码和域就可以运行成功,但是只要设置了就会出现异常:HTTP 请求未经客户端身份验证方案“Negotiate”授权。从服务器收到的身份验证标头为“Negotiate”。请问应该怎么解决?
                 谢谢您!
                 我是使用一台电脑运行的程序,和这个有关系么?
    谢谢你的提醒。
    代码我重新上传了。忘记和你说了~

    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年10月21日 13:08
    2009年10月21日 11:00
    版主

全部回复

  • Hi,
    谢谢你的提问。
    看你的描述,可能我代码上传错误了。
    我检查一下代码,然后最迟今天晚上12点前给你回复。
    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年10月20日 1:18
    版主
  • 很可能是我代码上传错了。
    很感谢你的提示~
    我回去后好好检查~
    谢谢啦,希思猫
    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年10月20日 1:27
    版主
  • 您太客气了,我最近在学习您的文章感觉受益匪浅,关于基本身份验证的问题我通过查看MSDN解决了不过我还有个问题,希望您给我解答。

    您好,我看了您的传输安全模式之匿名客户端后按照您的文章做了下,很成功,但是我有几个问题。
    1.我在验证服务器证书的回调方法中查看了一下SslPolicyErrors error这个参数,发现这个参数包含RemoteCertificateNameMismatch项,我很奇怪它代表的意思是证书名称不匹配,为什么会出现这种情况?既然不匹配那是不是应该验证失败啊?
    2.对于SSL的作用我有点不明白,我的理解是如果A服务器使用了SSL,那么如果B服务器即使有和A相同的程序,但是由于没有证书所以客户端只会和A建立连接而不会和B建立连接?这样的理解对么?我是个初学者,问的问题太幼稚了,希望您能在百忙之中回答我,谢谢您!
    2009年10月21日 10:26
  • 版主您好:
                最近一直在学习您的WCF系列文章,今天看到基本身份验证(Windows账户密码)有很多问题,希望您在百忙之中给我解答一下。
                1.服务端配置文件:您在播客中写的是<transport clientCredentialType="Basic"/>但是在您的代码中写的是<transport clientCredentialType="Windows"/>,这个我有点不太明白,到底是哪个正确,还是他们都是可以实现的。
                2.客户端设置用户名密码:您在播客中写的是wcfServiceProxy.ClientCredentials.UserName.UserName = "Administrator",但是在您的代码中写的是wcfServiceProxyHttp.ClientCredentials.Windows.ClientCredential.UserName = "frank.xu"请问这两个有什么区别?
                3.绑定协议:您在播客中使用的是wsHttpBinding而代码中使用的是basicHttpBinding,这个我也不太明白。
                4.我在做这个例子时如果使用使用Basic模式时,就会出现异常:客户端身份验证方案“Basic”禁止 HTTP 请求。请问应该怎么解决呢?如果我使用Windows模式,那么我如果不设置用户名密码和域就可以运行成功,但是只要设置了就会出现异常:HTTP 请求未经客户端身份验证方案“Negotiate”授权。从服务器收到的身份验证标头为“Negotiate”。请问应该怎么解决?
                 谢谢您!
                 我是使用一台电脑运行的程序,和这个有关系么?
    谢谢你的提醒。
    代码我重新上传了。忘记和你说了~

    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年10月21日 13:08
    2009年10月21日 11:00
    版主
  • 您太客气了,我最近在学习您的文章感觉受益匪浅,关于基本身份验证的问题我通过查看MSDN解决了不过我还有个问题,希望您给我解答。

    您好,我看了您的传输安全模式之匿名客户端后按照您的文章做了下,很成功,但是我有几个问题。
    1.我在验证服务器证书的回调方法中查看了一下SslPolicyErrors error这个参数,发现这个参数包含RemoteCertificateNameMismatch项,我很奇怪它代表的意思是证书名称不匹配,为什么会出现这种情况?既然不匹配那是不是应该验证失败啊?
    2.对于SSL的作用我有点不明白,我的理解是如果A服务器使用了SSL,那么如果B服务器即使有和A相同的程序,但是由于没有证书所以客户端只会和A建立连接而不会和B建立连接?这样的理解对么?我是个初学者,问的问题太幼稚了,希望您能在百忙之中回答我,谢谢您!

    Hi,
    不好意思。我忘记回答了。别介意啊~
    1.sslPolicyErrors 是一个枚举类型,主要是表示远程服务器证书验证的错误结果。
    None 无 SSL 策略错误。 
    RemoteCertificateChainErrors ChainStatus 已返回非空数组。 
    RemoteCertificateNameMismatch 证书名称不匹配。 
    RemoteCertificateNotAvailable 证书不可用。 

    我们这里为了调试WCF的传输安全,服务器证书客户端可能存在不信任等问题,这个是临时制作的证书。所以在客户端加了一个RemoteCertificateValidate方法,无论如何都返回True,强制信任服务器证书,这样才能建立SSL连接。
     SslPolicyErrors.RemoteCertificateNameMismatch一般是访问的url名字和证书中的cnname名称不一致

    临时解决办法可以在本地host文件中加入

    证书域名    访问IP地址
    http://hi.baidu.com/ju_feng/blog/item/36d24358e7ddfbd69d82041d.html
    2.SSL你可以搜索一下,介绍的文章很多。这里也有讨论:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/e1aa7bea-90d8-41e6-b91b-7addba44f8e3。你理解的不准确。客户端在和服务器连接之前,会现验证服务器的证书是否有效,以免连接到错误的服务器。


    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年10月22日 1:28
    版主
  • 这个文章的评论里也讨论了SSL

    http://www.cnblogs.com/frank_xl/archive/2009/08/21/1544034.html
    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年10月22日 1:33
    版主