Angepasstes Benutzerauthentifizierungsverfahren implementieren
In der folgenden Tabelle stellt die Beschreibung den SQL-Datentyp bereit. Wenn Sie Ihr Skript in Java oder .NET schreiben, müssen Sie den entsprechenden Datentyp benutzen. Siehe SQL-Java-Datentypen und SQL-.NET-Datentypen.
In SQL-Skripten können Sie Ereignisparameter mit ihrem Namen oder mit einem Fragezeichen angeben. Die Verwendung von Fragezeichen ist veraltet und es wird empfohlen, benannte Parameter zu verwenden. Sie können nicht Namen und Fragezeichen in einem Skript mischen. Wenn Sie Fragezeichen verwenden, müssen die Parameter in der nachfolgend gezeigten Reihenfolge stehen und sind nur dann optional, wenn keine nachfolgenden Parameter angegeben wurden (z.B. müssen Sie Parameter 1 verwenden, wenn Sie Parameter 2 verwenden möchten). Wenn Sie benannte Parameter verwenden, können Sie beliebige Teilmengen der Parameter in beliebiger Reihenfolge angeben.
Parametername für SQL-Skripten | Beschreibung | Reihenfolge (veraltet für SQL) |
---|---|---|
s.authentication_status | INTEGER. Dies ist ein INOUT-Parameter. | 1 |
s.remote_id | VARCHAR(128). Die entfernte ID von MobiLink. Sie können die entfernte ID nur dann referenzieren, wenn Sie benannte Parameter verwenden. | Nicht anwendbar |
s.username | VARCHAR(128). Der MobiLink-Benutzername | 2 |
s.hashed_password | BINARY(32). Wenn der Benutzer kein Kennwort eingibt, ist sein Wert NULL. | 3 |
s.hashed_new_password | BINARY(32). Wenn mit diesem Ereignis nicht das Benutzerkennwort geändert wird, ist dieser Wert NULL. | 4 |
Integriertes MobiLink-Benutzerauthenifizierungverfahren verwenden.
Dieses Ereignis ist dasselbe wie authenticate_user, abgesehen von den Kennwörtern, die dasselbe Hash-Format haben wie diejenigen aus der Spalte ml_user.hashed_password. Durch die Übergabe der Kennwörter im Hash-Format wird die Sicherheit erhöht.
Ein Einweg-Hash wird benutzt. Ein Einweg-Hash übernimmt ein Kennwort und konvertiert es in eine Bytesequenz, die (im Wesentlichen) für jedes mögliche Kennwort einmalig ist. Mit dem Einweg-Hash kann die Kennwortauthentifizierung vorgenommen werden, ohne dass das tatsächliche Kennwort in der konsolidierten Datenbank gespeichert werden muss.
Aufgrund von inkrementellen Verbesserungen an der Qualität der Hashes in allen MobiLink-Versionen kann dieses Skript während einer Authentifizierungssequenz für einen Benutzer mehrmals aufgerufen werden.
Wenn die beiden Authentifizierungsskripten authenticate_user und authenticate_user_hashed definiert sind und beide Skripten unterschiedliche authentication_status-Codes zurückgeben, wird der höhere Wert verwendet.
Ein typisches authenticate_user_hashed-Skript ist ein Aufruf einer gespeicherten Prozedur. Die Reihenfolge der Parameter im Aufruf muss mit der oben angegebenen Reihenfolge übereinstimmen. Das folgende Beispiel ruft ml_add_connection_script auf, um das Ereignis der gespeicherten Prozedur my_auth zuzuweisen.
CALL ml_add_connection_script( 'ver1', 'authenticate_user_hashed', 'call my_auth ( {ml s.authentication_status}, {ml s.username}, {ml s.hashed_password})' ) |
Die nachstehende gespeicherte Prozedur in SQL Anywhere benutzt den Benutzernamen und das Kennwort für die Authentifizierung. Die Prozedur stellt nur sicher, dass der angegebene Benutzername eine der Mitarbeiter-IDs in der Tabelle ULEmployee ist. Die Prozedur geht davon aus, dass die Tabelle Employee eine Spalte binary(20) namens hashed_pwd besitzt.
CREATE PROCEDURE my_auth( inout @authentication_status integer, in @user_name varchar(128), in @hpwd binary(32) ) BEGIN IF EXISTS ( SELECT * FROM ulemployee WHERE emp_id = @user_name and hashed_pwd = @hpwd ) THEN message 'OK' type info to client; RETURN 1000; ELSE message 'Not OK' type info to client; RETURN 4000; END IF END |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens authUserHashed als das Skript für das Ereignis authenticate_user_hashed, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_java_connection_script( 'ver1', 'authenticate_user_hashed', 'ExamplePackage.ExampleClass.authUserHashed') |
Im Folgenden sehen Sie die Java-Beispielmethode authUserHashed. Sie ruft Java-Methoden auf, die das Benutzerkennwort prüfen und gegebenenfalls ändern.
public String authUserHashed( ianywhere.ml.script.InOutInteger authStatus, String user, byte pwd[], byte newPwd[] ) throws java.sql.SQLException { // A real authenticate_user_hashed handler // would handle more auth code states. _curUser = user; if( checkPwdHashed( user, pwd ) ) { // Authorization successful. if( newPwd != null ) { // Password is being changed. if( changePwdHashed( user, pwd, newPwd ) ) { // Authorization OK and password change OK. // Use custom code. authStatus.setValue( 1001 ); } else { // Auth OK but password change failed. // Use custom code java.lang.System.err.println( "user: " + user + " pwd change failed!" ); authStatus.setValue( 1002 ); } } else { authStatus.setValue( 1000 ); } } else { // Authorization failed. authStatus.setValue( 4000 ); } return ( null ); } |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens AuthUserHashed als das Skript für das Verbindungsereignis authenticate_user_hashed, wenn die Skriptversion ver1 synchronisiert wird. Diese Syntax gilt für konsolidierte SQL Anywhere-Datenbanken.
CALL ml_add_dnet_connection_script( 'ver1', 'authenticate_user_hashed', 'TestScripts.Test.AuthUserHashed' ) |
Im Folgenden sehen Sie die .NET-Beispielmethode AuthUserHashed.
public string AuthUserHashed( ref int authStatus, string user, byte[] pwdHash, byte[] newPwdHash ) { // A real authenticate_user_hashed handler // would handle more auth code states. _curUser = user; if( CheckPwdHashed( user, pwdHash ) ) { // Authorization successful. if( newPwdHash != null ) { // Password is being changed. if( ChangePwdHashed( user, pwdHash, newPwdHash ) ) { // Authorization OK and password change OK. // Use custom code. authStatus = 1001; } else { // Auth OK but password change failed. // Use custom code System.Console.WriteLine( "user: " + user + " pwd change failed!" ); authStatus = 1002; } } else { authStatus = 1000; } } else { // Authorization failed. authStatus = 4000; } return ( null ); } |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |