使用 HTTP 信道进行身份验证

本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用  Windows Communication Foundation (WCF) 来开发分布式应用程序。

若要使用 HttpChannel 信道对远程调用进行身份验证,必须在 Internet 信息服务 (IIS) 下承载该远程对象。

服务器配置

服务器上的所有身份验证配置都是通过 IIS 完成的。服务器上不存在与 HttpChannel 身份验证相关的配置设置。有关 IIS 和配置身份验证的更多信息,请参见 IIS 身份验证(可能为英文网页)。

客户端配置

在调用承载于 IIS 下并配置为进行身份验证的远程对象时,客户端必须指定凭据。若要自动发送客户端应用程序当前使用的凭据,请将 useDefaultCredentials 属性设置为 true

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application>
      <channels>
        <channel ref="http" useDefaultCredentials="true"/>
      </channels>
      <client>
        <wellknown 
           url="http://MyServer/IISSec/MyRemoteObj.rem"
           type="Shared.MyRemoteObj, Shared"/>
      </client>
    </application>
  </system.runtime.remoting>
</configuration>

如果要指定其他凭据集,则可以通过编程方式实现此目的,如下面的代码所示:

MyRemoteObj obj = new MyRemoteObj();
// Get the current set of channel sink properties
IDictionary props = ChannelServices.GetChannelSinkProperties(obj);
// Set domain, username, and password properties
props["domain"] = "SomeDomain";
props["username"] = "SomeUser";
props["password"] = "SomePassword123";
Console.WriteLine(obj.SayHello());

另外,您也可以通过编程方式设置 credentials 属性,并在此过程中指定实现 ICredentials 接口的类。首先,请创建实现 ICredentials 接口的类:

namespace MyCredentialsLib
{
    public class MyCredentials : ICredentials
    {
        public NetworkCredential GetCredential(Uri uri, string authType)
        {
            Console.WriteLine("MyCredentials.GetCredential() called");
            NetworkCredential newCred = new NetworkCredential("SomeRemotingUser", "SomePassword");
            return newCred;
        }
    }
} 

接下来,必须在客户端中创建实现 ICredentials 的类的实例,然后将 credentials 属性设置为该实例,如下面的代码所示:

RemotingConfiguration.Configure("client.exe.config", false);
MyRemoteObj obj = new MyRemoteObj();
IDictionary props = ChannelServices.GetChannelSinkProperties(obj);
MyCredentials credentials = new MyCredentials();
props["credentials"] = credentials;
Console.WriteLine(obj.SayHello()); 
36tfwzb0.note(zh-cn,VS.100).gif注意:
将凭据硬编码为应用程序始终不是一个好的做法。此处这样做只是为了便于说明。

useAuthenticatedConnectionSharing 属性指示服务器信道重用经过身份验证的连接,而不是对每次传入的调用都进行身份验证。将 useDefaultCredentials 设置为 true 时,此属性的默认值为 true。可以在配置文件中(在 <channel> 元素内)设置此属性,也可以用编程方式实现此目的(具体做法与设置 usernamepassword 属性的方式完全相同,如前面的示例代码所示)。

unsafeAuthenticatedConnectionSharing 属性指示客户端提供其自己的凭据和连接组名,以供服务器在创建通过身份验证的连接组时使用。如果将此属性设置为 true,则必须将 connectionGroupName 属性设置为单个经过身份验证的用户。如果将 useAuthenticatedConnectionSharing 属性设置为 true,则忽略此属性。

另请参见

概念

使用 TCP 信道进行身份验证
使用 IPC 信道进行身份验证
加密和消息完整性