Megosztás a következőn keresztül:


Útmutató: Egyéni felhasználónév és jelszó-érvényesítő használata

Ha a hitelesítéshez felhasználónevet és jelszót használ, a Windows Communication Foundation (WCF) alapértelmezés szerint a Windows használatával ellenőrzi a felhasználónevet és a jelszót. A WCF azonban lehetővé teszi az egyéni felhasználónév- és jelszó-hitelesítési sémákat, más néven érvényesítőket. Ha egyéni felhasználónevet és jelszó-érvényesítőt szeretne beépíteni, hozzon létre egy osztályt, amelyből UserNamePasswordValidator származik, majd konfigurálja azt.

Egy mintaalkalmazást a felhasználónév jelszó-érvényesítője című témakörben talál.

Egyéni felhasználónév és jelszó-érvényesítő létrehozása

  1. Hozzon létre egy osztályt, amely a forrásból UserNamePasswordValidatorszármazik.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. Implementálja az egyéni hitelesítési sémát a Validate módszer felülírásával.

    Ne használja a következő példában szereplő kódot, amely felülírja a Validate metódust egy éles környezetben. Cserélje le a kódot az egyéni felhasználónévre és jelszó-érvényesítési sémára, amely magában foglalhatja a felhasználónevek és jelszópárok beolvasását egy adatbázisból.

    Ha vissza szeretné adni a hitelesítési hibákat az ügyfélnek, adja meg a Validate metódustFaultException.

    // 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 informative fault to the client,
            // throw the following exception.
            // throw new SecurityTokenException("Unknown Username or Incorrect Password");
        }
    }
    
    ' 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 = "[PLACEHOLDER]") AndAlso Not (userName = "test2" AndAlso password = "[PLACEHOLDER]") 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 informative fault to the client,
            ' throw the following exception:
            ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
        End If
    
    End Sub
    

Szolgáltatás konfigurálása egyéni felhasználónév és jelszó-érvényesítő használatára

  1. Konfiguráljon egy olyan kötést, amely üzenetbiztonságot használ bármilyen átviteli vagy átviteli szintű http(s) protokollon keresztül.

    Üzenetbiztonság használatakor adja hozzá a rendszer által biztosított kötések egyikét, például a <wsHttpBindinget> vagy egy <egyénibindinget>, amely támogatja az üzenetek biztonságát és a UserName hitelesítő adatok típusát.

    Ha átviteli szintű biztonságot használ HTTP(S-n) keresztül, adja hozzá a wsHttpBinding vagy< az alapszintűHttpBinding>>, a< netTcpBinding> vagy a <HTTP(S) protokollt használó egyénibindinget> és a hitelesítési sémát.Basic<

    Feljegyzés

    A .NET-keretrendszer 3.5-ös vagy újabb verziók használatakor egyéni felhasználónevet és jelszó-érvényesítőt használhat üzenet- és átviteli biztonsággal. A WinFX használatával egyéni felhasználónév és jelszó-érvényesítő csak üzenetbiztonsággal használható.

    Tipp.

    A netTcpBinding ebben a környezetben való használatáról további információt a biztonság> című témakörben talál<.<>

    1. A konfigurációs fájlban a <system.serviceModel> elem alatt adjon hozzá egy <kötési> elemet.

    2. Adjon hozzá egy wsHttpBinding> vagy <alapszintűHttpBinding> elemet a kötések szakaszhoz.< A WCF-kötéselemek létrehozásáról további információt a Hogyan lehet: Szolgáltatáskötés megadása a konfigurációban című témakörben talál.

    3. mode A biztonság> vagy <a <biztonság> attribútumának beállítása a következőreMessage: , Transportvagy .TransportWithMessageCredential

    4. Állítsa be az clientCredentialType üzenet> vagy <az átvitel> attribútumát.<

      Az üzenetbiztonság használatakor állítsa az clientCredentialType üzenet> attribútumát a <következőreUserName: .

      Ha átviteli szintű biztonságot használ HTTP(S)-en keresztül, állítsa be az clientCredentialType átvitel vagy <az átvitel>> attribútumát a <következőreBasic: .

      Feljegyzés

      Ha egy WCF-szolgáltatást az Internet Information Services (IIS) üzemeltet átviteli szintű biztonsággal, és a UserNamePasswordValidationMode tulajdonság értéke Customa következő, az egyéni hitelesítési séma a Windows-hitelesítés egy részhalmazát használja. Ennek az az oka, hogy ebben a forgatókönyvben az IIS windowsos hitelesítést hajt végre, mielőtt a WCF az egyéni hitelesítőt invokálna.

    A WCF-kötéselemek létrehozásáról további információt a Hogyan lehet: Szolgáltatáskötés megadása a konfigurációban című témakörben talál.

    Az alábbi példa a kötés konfigurációs kódját mutatja be:

    <system.serviceModel>
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. Konfiguráljon egy viselkedést, amely meghatározza, hogy egy egyéni felhasználónevet és jelszó-érvényesítőt használjon a bejövő UserNameSecurityToken biztonsági jogkivonatok felhasználóneveinek és jelszópárjainak ellenőrzéséhez.

    1. A system.serviceModel elem gyermekként <adjon hozzá egy< viselkedési> elemet.>

    2. Adjon hozzá egy serviceBehaviort> a <viselkedési elemhez>.<

    3. Adjon hozzá egy viselkedési <>elemet, és állítsa be az name attribútumot egy megfelelő értékre.

    4. Szolgáltatás hitelesítő adatainak><hozzáadása a viselkedési <> elemhez.

    5. Adjon hozzá egy userNameAuthentication azonosítót> a <szolgáltatás hitelesítő adataihoz>.<

    6. Állítsa be a userNamePasswordValidationMode következőt Custom: .

      Fontos

      Ha az érték nincs beállítva, a userNamePasswordValidationMode WCF az egyéni felhasználónév és jelszó-érvényesítő helyett Windows-hitelesítést használ.

    7. Állítsa be az customUserNamePasswordValidatorType egyéni felhasználónevet és jelszó-érvényesítőt jelölő típust.

    Az alábbi példában az ehhez a <serviceCredentials> ponthoz megadott töredék látható:

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

Példa

Az alábbi példakód bemutatja, hogyan hozhat létre egyéni felhasználónevet és jelszó-érvényesítőt. Ne használja azt a kódot, amely felülírja a Validate metódust éles környezetben. Cserélje le a kódot az egyéni felhasználónévre és jelszó-érvényesítési sémára, amely magában foglalhatja a felhasználónevek és jelszópárok beolvasását egy adatbázisból.

using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

using System.Security.Principal;

using System.ServiceModel;
Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens

Imports System.Security.Principal

Imports 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 informative fault to the client,
            // throw the following exception.
            // throw new SecurityTokenException("Unknown Username or Incorrect Password");
        }
    }
}
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 = "[PLACEHOLDER]") AndAlso Not (userName = "test2" AndAlso password = "[PLACEHOLDER]") 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 informative fault to the client,
            ' throw the following exception:
            ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
        End If

    End Sub
End Class

Lásd még