以 HTTP 通道進行驗證
本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。
若要以 HttpChannel 通道來驗證遠端呼叫,遠端物件必須使用網際網路資訊服務 (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());
注意: |
---|
絕對不要將認證加以硬式編碼,並放在應用程式中。此處作法僅供說明用途。 |
useAuthenticatedConnectionSharing 屬性,指出伺服器通道會重複使用驗證的連線,而不是驗證每個傳入的呼叫。當 useDefaultCredentials 設為 true,此屬性將預設為 true。您可以透過組態檔 (於 <channel> 項目中) 或以程式設計方式來設定此屬性 (與上述範例程式碼用來設定 username 與 password 屬性的方式一模一樣)。
unsafeAuthenticatedConnectionSharing 屬性指出用戶端會提供本身的認證與連線群組名稱,以供伺服器用來建立驗證的連線群組。如果此屬性設為 true,則 connectionGroupName 屬性必須設為單一驗證使用者。如果 useAuthenticatedConnectionSharing 屬性設定為 true,則會忽略這個屬性。