none
WCFwindows用户认证疑问 RRS feed

  • 常规讨论

  • 疑问如下:
    1.我使用mess+windows基本用户认证的组合,客户端和宿主都在同一机器上,发现只能用administrator用户通过认证,其他机器上的用户都不行,这是怎么回事
    2.我用客户端正常获取服务之后,宿主用什么方法可以获取到客户端的信息?比如说得到当前调用用户的标识和权限组.
    先谢过大家.
    2009年11月10日 2:07

全部回复

  • 疑问如下:
    1.我使用mess+windows基本用户认证的组合,客户端和宿主都在同一机器上,发现只能用administrator用户通过认证,其他机器上的用户都不行,这是怎么回事
    2.我用客户端正常获取服务之后,宿主用什么方法可以获取到客户端的信息?比如说得到当前调用用户的标识和权限组.
    先谢过大家.

    第一个问题,你先把配置文件贴出来,我先回答你第二个问题:

    [ServiceContract()]
    public interface ITest
    {
     [OperationContract(Action = "isOnline")]
      void IsOnline();
    };

    [ServiceBehavior()]
    public class Test : ITest
    {
     public void IsOnline()
     {
       ServiceSecurityContext ctx = OperationContext.Current.ServiceSecurityContext;
       WindowsIdentity identity = ctx.WindowsIdentity; 
     }
    };

    2009年11月10日 3:18
  • 谢谢,这是我的宿主端的配置文件
    <system.serviceModel>
            <bindings>
                <netTcpBinding>
                    <binding name="NewBinding0">
                        <security mode="Message" />
                    </binding>
                </netTcpBinding>
            </bindings>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="HostTest.Service1Behavior">
                        <serviceMetadata httpGetEnabled="false" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service behaviorConfiguration="HostTest.Service1Behavior"
                    name="HostTest.Service1">
                    <endpoint address="" binding="netTcpBinding" bindingConfiguration="NewBinding0"
                        contract="HostTest.IService1">
                        <identity>
                            <dns value="localhost" />
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
                        contract="IMetadataExchange" />
                    <host>
                        <baseAddresses>
                            <add baseAddress="net.tcp://localhost:8731" />
                        </baseAddresses>
                    </host>
                </service>
            </services>
        </system.serviceModel>
    2009年11月10日 3:48
  • 谢谢,这是我的宿主端的配置文件
    <system.serviceModel>
            <bindings>
                <netTcpBinding>
                    <binding name="NewBinding0">
                        <security mode="Message" />
                    </binding>
                </netTcpBinding>
            </bindings>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="HostTest.Service1Behavior">
                        <serviceMetadata httpGetEnabled="false" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service behaviorConfiguration="HostTest.Service1Behavior"
                    name="HostTest.Service1">
                    <endpoint address="" binding="netTcpBinding" bindingConfiguration="NewBinding0"
                        contract="HostTest.IService1">
                        <identity>
                            <dns value="localhost" />
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
                        contract="IMetadataExchange" />
                    <host>
                        <baseAddresses>
                            <add baseAddress="net.tcp://localhost:8731" />
                        </baseAddresses>
                    </host>
                </service>
            </services>
        </system.serviceModel>

    <dns value="localhost" />
    把localhost改成你的服务器的计算机名称.
    还有疑问,可以参考版主的这篇文章:http://www.cnblogs.com/frank_xl/archive/2009/08/25/1543864.html
    2009年11月10日 5:22
  • 不好意思,我就是照着版主那篇文章来做的,只不过客户端身份验证使用的不是Windows域服务器,而是Windows的计算机用户.下面是出现的异常:
    目标“net.tcp://localhost:8731/”的与“net.tcp://localhost:8731/”的 SOAP 安全协商失败。有关详细信息,请参阅内部异常。
    2009年11月10日 5:58
  • 不好意思,我就是照着版主那篇文章来做的,只不过客户端身份验证使用的不是Windows域服务器,而是Windows的计算机用户.下面是出现的异常:
    目标“net.tcp://localhost:8731/”的与“net.tcp://localhost:8731/”的 SOAP 安全协商失败。有关详细信息,请参阅内部异常。

    你得使用域帐号登录才行.
    2009年11月10日 6:06
  • 我是想使用windows的集成用户登陆,而不想用域用户,那我用administrator用户为什么可以登陆使用呢?
    2009年11月10日 6:09
  • 我是想使用windows的集成用户登陆,而不想用域用户,那我用administrator用户为什么可以登陆使用呢?

    服务器也有administrator用户.你在服务器上建一个用户 WcfUser,密码 123456,用这个登录试试.
    2009年11月10日 6:16
  • 我是想使用windows的集成用户登陆,而不想用域用户,那我用administrator用户为什么可以登陆使用呢?

    服务器也有administrator用户.你在服务器上建一个用户 WcfUser,密码 123456,用这个登录试试.
    我也试过了,隶属于administrators组的,除了administrator用户都不行.
    2009年11月10日 6:28
  • 我发现有个问题,就是用ServiceSecurityContext.Current.PrimaryIdentity.Name显示的我的宿主端的用户是guest,而客户端用WindowsIdentity.GetCurrent().Name得到的用户却是administrator,可我明明是在同一机器上运行的!是不是证书的问题引起的呢,怎么解决?
    2009年11月10日 8:34
  • 我发现有个问题,就是用ServiceSecurityContext.Current.PrimaryIdentity.Name显示的我的宿主端的用户是guest,而客户端用WindowsIdentity.GetCurrent().Name得到的用户却是administrator,可我明明是在同一机器上运行的!是不是证书的问题引起的呢,怎么解决?

    你的问题还没解决啊?我等你的答案呢.
    2009年11月11日 1:52
  • 我只能等版主出现了...
    2009年11月11日 2:44
  • 你好,

    1.请问使用IIS Host的吗? 能够提供一个简单的重现问题的项目吗?请上传到http://skydrive.live.com/然后贴个连接.

    2.在代码中要得到的话可以用:
    WindowsIdentity wi = OperationContext.Current.ServiceSecurityContext.WindowsIdentity;
    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月11日 10:15
    版主
  • 不好意思,昨晚没有上线,刚刚才看到你的回复,我已经上传了,地址如下:
    感谢你的回复
    2009年11月12日 1:30
  • 其它都没问题,只是你调用客户端填写凭据的时候需要注意,下面三个值:

    client.ClientCredentials.Windows.ClientCredential.UserName = "galactica";
    client.ClientCredentials.Windows.ClientCredential.Password = "123456";
    client.ClientCredentials.Windows.ClientCredential.Domain = "msdn";   //域名或者机器名

    也就是说你的客户端凭据传递到服务器后会变成下面这个样子:

    用户名: msdn\galactica
    密   码: 123456

    2009年11月12日 2:38
  • to Galactica:我没有使用域认证,而是使用本机的用户,这样不行吗?而且为什么显示host端的用户是guest?而client端的就是administrator?


    2009年11月12日 3:40
  • to Galactica:我没有使用域认证,而是使用本机的用户,这样不行吗?而且为什么显示host端的用户是guest?而client端的就是administrator?



    我描述下部署场景,服务部署在A机器上,A机器上有两个用户user1和user2,
    user1是域msdn下的用户,user2不在域里.

    客户端在B机器上,B上有一个msdn域用户user3,那么从B要访问A上的服务,B需要提供的客户端凭据是:

    一种是使用域帐户: user1或user3,同时指定Domain为msdn;
    另一种是适用计算机帐户:user2,同时指定Domain为 A;

    也就是说,客户端提供的凭据,服务端可以通过两种方式来认证,一是通过域服务器来验证,另一种就是通过服务端计算机的本地计算机帐户来认证.
    2009年11月12日 3:50
  • 既然用windows用户也可以认证,那我其他的计算机用户怎么会登陆不了呢?只有administrator用户才可以登陆.这就是我的问题.
    2009年11月12日 5:28
  • 既然用windows用户也可以认证,那我其他的计算机用户怎么会登陆不了呢?只有administrator用户才可以登陆.这就是我的问题.

    你其它的计算机帐户必须是运行wcf服务的机器上的计算机帐户,
    客户端填写用户名,密码后,还要指定Domain为你运行WCF服务的机器名称.
    2009年11月12日 5:41
  • 我测试过了,依然是同样的问题,不过还是谢谢Galactica的回复.
    2009年11月12日 8:59
  • 你好,
    我这里试了你的代码没有问题. 你把客户端这个配置删除看看能工作否.加了以后客户端会额外地做验证服务器端的工作.你的配置是要求服务器端的DNS为"now".

    <

     

    identity>

    <

     

    dns value="now" />

    </

     

    identity>


    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月13日 2:56
    版主
  • 周末一直没有上网,不好意思,我已经照你的方法删除了客户端的<identity>节点,但是还是一样的问题
    2009年11月16日 1:22
  • 周末一直没有上网,不好意思,我已经照你的方法删除了客户端的<identity>节点,但是还是一样的问题
    2009年11月16日 1:23
  • 你好,
    请问你测试的机器帐户是什么? 密码能够保证正确吗?
    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日 6:38
    版主