Ú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
Hozzon létre egy osztályt, amely a forrásból UserNamePasswordValidatorszármazik.
public class CustomUserNameValidator : UserNamePasswordValidator {
Public Class CustomUserNameValidator Inherits UserNamePasswordValidator
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
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<.<>
A konfigurációs fájlban a <system.serviceModel> elem alatt adjon hozzá egy <kötési> elemet.
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.
mode
A biztonság> vagy <a <biztonság> attribútumának beállítása a következőreMessage
: ,Transport
vagy .TransportWithMessageCredential
Á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>
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.
A system.serviceModel elem gyermekként <adjon hozzá egy< viselkedési> elemet.>
Adjon hozzá egy serviceBehaviort> a <viselkedési elemhez>.<
Adjon hozzá egy viselkedési <>elemet, és állítsa be az
name
attribútumot egy megfelelő értékre.Szolgáltatás hitelesítő adatainak><hozzáadása a viselkedési <> elemhez.
Adjon hozzá egy userNameAuthentication azonosítót> a <szolgáltatás hitelesítő adataihoz>.<
Állítsa be a
userNamePasswordValidationMode
következőtCustom
: .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.Á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