共用方式為


HOW TO:使用自訂使用者名稱與密碼驗證程式

根據預設,使用使用者名稱和密碼進行驗證時,Windows Communication Foundation (WCF) 會使用 Windows 驗證使用者名稱和密碼。不過,WCF 允許自訂的使用者名稱和密碼驗證結構描述,也稱為驗證程式。若要納入自訂的使用者名稱和密碼驗證程式,請建立衍生自 UserNamePasswordValidator 的類別,然後予以設定。

如需範例應用程式,請參閱 使用者名稱密碼驗證程式

建立自訂的使用者名稱和密碼驗證程式

  1. 建立衍生自 UserNamePasswordValidator 的類別。

    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
  2. 覆寫 Validate 方法,實作自訂驗證結構描述。

    請勿在實際執行環境使用下列範例中會覆寫 Validate 方法的程式碼。將此程式碼以自訂的使用者名稱和密碼驗證結構描述取代,其中可能包含從資料庫擷取使用者名稱和密碼組。

    若要將驗證錯誤傳回至用戶端,請在 Validate 方法中擲回 FaultException

    ' This method validates users. It allows in two users, test1 and test2 
    ' with passwords 1tset and 2tset respectively.
    ' This code is for illustration purposes only and 
    ' must not be used in a production environment because it is not secure.    
    Public Overrides Sub Validate(ByVal userName As String, ByVal password As String)
        If Nothing = userName OrElse Nothing = password Then
            Throw New ArgumentNullException()
        End If
    
        If Not (userName = "test1" AndAlso password = "1tset") AndAlso Not (userName = "test2" AndAlso password = "2tset") Then
            ' This throws an informative fault to the client.
            Throw New FaultException("Unknown Username or Incorrect Password")
            ' When you do not want to throw an infomative fault to the client,
            ' throw the following exception.
            ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
        End If
    
    End Sub
    
    // This method validates users. It allows in two users, test1 and test2 
    // with passwords 1tset and 2tset respectively.
    // This code is for illustration purposes only and 
    // must not be used in a production environment because it is not secure.    
    public override void Validate(string userName, string password)
    {
        if (null == userName || null == password)
        {
            throw new ArgumentNullException();
        }
    
        if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))
        {
            // This throws an informative fault to the client.
            throw new FaultException("Unknown Username or Incorrect Password");
            // When you do not want to throw an infomative fault to the client,
            // throw the following exception.
            // throw new SecurityTokenException("Unknown Username or Incorrect Password");
        }
    }
    

將服務設定為使用自訂的使用者名稱和密碼驗證程式

  1. 設定繫結,此繫結會在 HTTP(S) 上的任何傳輸或傳輸層級安全性使用訊息安全性。

    使用訊息安全性時,請新增其中一個系統提供的繫結,例如 wsHttpBinding Element,或是支援訊息安全性和 UserName 認證類型的 customBinding Element

    在 HTTP(S) 上使用傳輸層級安全性時,請新增 wsHttpBinding Element<basicHttpBinding><netTcpBinding>,或者使用 HTTP(S) 和 Basic 驗證配置的 customBinding Element

    Aa702565.note(zh-tw,VS.100).gif注意:
    使用 .NET Framework version 3.5 (含) 以後版本時,您可以將自訂使用者名稱和密碼驗證器搭配訊息安全性和傳輸安全性使用。透過 .NET Framework 3.0,自訂使用者名稱和密碼驗證器只能與訊息安全性配合使用。

    Aa702565.Tip(zh-tw,VS.100).gif提示:
    如需在此內容中使用 <netTcpBinding> 的詳細資訊,請參閱 <security> of <netTcpBinding>

    1. 在組態檔的 <system.ServiceModel> 項目中新增 <bindings> 項目。

    2. wsHttpBinding Element<basicHttpBinding> 項目加入至繫結區段。如需詳細資訊建立 WCF 繫結項目的詳細資訊,請參閱 HOW TO:指定組態中的服務繫結

    3. security element of wsHttpBinding<security> of <basicHttpBinding>mode 屬性設定為 MessageTransportor TransportWithMessageCredential

    4. 設定 message element of wsHttpBinding<transport> of <wsHttpBinding>clientCredentialType 屬性。

      使用訊息安全性時,將 message element of wsHttpBindingclientCredentialType 屬性設定為 UserName

      在 HTTP(S) 上使用傳輸層級安全性時,將 <transport> of <wsHttpBinding><transport> of <basicHttpBinding>clientCredentialType 屬性設定為 Basic

      Aa702565.note(zh-tw,VS.100).gif注意:
      當 WCF 服務使用傳輸層級安全性裝載在網際網路資訊服務 (IIS) 中,並且 UserNamePasswordValidationMode 屬性設定為 Custom 時,自訂驗證配置會使用 Windows 驗證的子集。這是因為在這種情況中,IIS 會在 WCF 叫用自訂驗證器之前,先執行 Windows 驗證。

    如需詳細資訊 建立 WCF 繫結項目的詳細資訊,請參閱 HOW TO:指定組態中的服務繫結

    下列程式碼範例顯示繫結的組態程式碼。

    <system.serviceModel> 
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>        
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. 設定行為,指定自訂使用者名稱和密碼驗證程式用來驗證傳入之 UserNameSecurityToken 安全性權杖的使用者名稱和密碼組。

    1. 加入 <behaviors> 項目做為 <system.serviceModel> 項目的子系。

    2. serviceBehaviors section加入至 <behaviors> 項目。

    3. 加入 <behavior> 項目,並將 name 屬性設定為適當值。

    4. <serviceCredentials> Element加入至 <behavior> 項目。

    5. userNameAuthentication element加入至 <serviceCredentials> Element

    6. userNamePasswordValidationMode 設定為 Custom

      Aa702565.Important(zh-tw,VS.100).gif 注意:
      如果沒有設定 userNamePasswordValidationMode 值,則 WCF 會使用 Windows 驗證,而不會使用自訂的使用者名稱和密碼驗證程式。

    7. customUserNamePasswordValidatorType 設為代表自訂使用者名稱和密碼驗證程式的類型。

    下列範例顯示目前的 <serviceCredentials> 片段。

    <serviceCredentials>
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" />
    </serviceCredentials>
    

範例

以下程式碼範例將示範如何建立自訂的使用者名稱和密碼驗證程式。請勿在實際執行環境使用會覆寫 Validate 方法的程式碼。將此程式碼以自訂的使用者名稱和密碼驗證結構描述取代,其中可能包含從資料庫擷取使用者名稱和密碼組。

Imports System

Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens

Imports System.Security.Principal

Imports System.ServiceModel

    

    
    ...
    
    

        Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
        ' This method validates users. It allows in two users, test1 and test2 
        ' with passwords 1tset and 2tset respectively.
        ' This code is for illustration purposes only and 
        ' must not be used in a production environment because it is not secure.    
        Public Overrides Sub Validate(ByVal userName As String, ByVal password As String)
            If Nothing = userName OrElse Nothing = password Then
                Throw New ArgumentNullException()
            End If

            If Not (userName = "test1" AndAlso password = "1tset") AndAlso Not (userName = "test2" AndAlso password = "2tset") Then
                ' This throws an informative fault to the client.
                Throw New FaultException("Unknown Username or Incorrect Password")
                ' When you do not want to throw an infomative fault to the client,
                ' throw the following exception.
                ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
            End If

        End Sub
    End Class
using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

using System.Security.Principal;

using System.ServiceModel;

    

    
    ...
    
    

    
        public class CustomUserNameValidator : UserNamePasswordValidator
        {
            // This method validates users. It allows in two users, test1 and test2 
            // with passwords 1tset and 2tset respectively.
            // This code is for illustration purposes only and 
            // must not be used in a production environment because it is not secure.   
            public override void Validate(string userName, string password)
            {
                if (null == userName || null == password)
                {
                    throw new ArgumentNullException();
                }

                if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))
                {
                    // This throws an informative fault to the client.
                    throw new FaultException("Unknown Username or Incorrect Password");
                    // When you do not want to throw an infomative fault to the client,
                    // throw the following exception.
                    // throw new SecurityTokenException("Unknown Username or Incorrect Password");
                }
            }
        }

另請參閱

工作

HOW TO:使用 ASP.NET 成員資格提供者

參考

UserNamePasswordValidator

其他資源

驗證