2012-06-22 34 views
0

我在使用Oracle11g和ASP.NET 4.0時使用了OracleMembershipProvider。從ASP.NET側創建用戶很容易,但我不太清楚如何從Oracle存儲過程中完成。如何從Oracle創建OracleMembershipProvider用戶?

我找到了ora_aspnet_Mem_CreateUser函數。但是,它被封裝,我找不到任何文檔,所以我不確定所有參數。此外,當您從ASP.NET調用CreateUser時,會出現一個帶有「MembershipCreateStatus枚舉值」的out參數,指示用戶是否已成功創建。 ora_aspnet_Mem_CreateUser唯一的輸出參數是userid,所以我甚至可以訪問狀態值?

我確實發現了this answer,這主要是我想要做的,但在T-SQL中。我需要在PL-SQL中完成,如果可能的話,我需要確定用戶是否成功創建。

回答

0

使用Reflector我發現MembershipCreateStatus out參數是ASP.NET函數的一部分,所以如果你想在Oracle函數中使用類似的東西,你必須自己編寫它。

我把一切都在PL-SQL的工作除了散列,所以同事寫在Java中的散列函數:

create or replace and compile java source named javasha1 
as 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 
import java.security.*; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
public class javasha1 { 
    public static java.lang.String EncodePassword(java.lang.String passPlain, java.lang.String saltBase64) 
     throws NoSuchAlgorithmException, UnsupportedEncodingException, IOException 
    { 
     BASE64Decoder decoder = new BASE64Decoder(); 
     BASE64Encoder encoder = new BASE64Encoder(); 

     byte[] pass = passPlain.getBytes("UTF-16LE"); 
     byte[] salt = decoder.decodeBuffer(saltBase64); 
     byte[] joined = new byte[salt.length + pass.length]; 
     System.arraycopy(salt, 0, joined, 0, salt.length); 
     System.arraycopy(pass, 0, joined, salt.length, pass.length); 

     MessageDigest sha = MessageDigest.getInstance("SHA-1"); 
     return encoder.encodeBuffer(sha.digest(joined)).replaceAll("\r|\n", ""); 
    } 
} 


FUNCTION EncodePassword 
(
    p_Password VARCHAR2, 
    p_Salt  VARCHAR2 
) 
RETURN VARCHAR2 
AS LANGUAGE java Name 'javasha1.EncodePassword(java.lang.String, java.lang.String) return java.lang.String'; 


PROCEDURE CreateUser 
(
    p_UserName   VARCHAR2, 
    p_ClearTextPassword VARCHAR2, 
    p_Email    VARCHAR2 
) 
AS 
    v_ApplicationName VARCHAR2(256); 
    v_EncodedPassword NVARCHAR2(128); 
    v_Now    DATE; 
    v_ReturnValue  NUMBER; 
    v_Salt   NVARCHAR2(128); 
    v_UserID   RAW(16); 

    FUNCTION Base64Encode 
    (
    p_Raw RAW 
) RETURN VARCHAR2 
    AS 
    BEGIN 
    RETURN utl_raw.cast_to_varchar2(utl_encode.base64_encode(p_Raw)); 
    END Base64Encode; 

BEGIN 
    v_ApplicationName := 'YOUR_APPLICATION_NAME'; 
    v_Now    := sys_extract_utc(Systimestamp); 
    v_Salt   := Base64Encode(sys_guid()); 
    v_EncodedPassword := EncodePassword(p_Password => p_ClearTextPassword, p_Salt => v_Salt); 

    v_ReturnValue := ora_aspnet.ora_aspnet_mem_createuser(
    applicationname_ => v_ApplicationName, 
    username_   => p_UserName, 
    password_   => v_EncodedPassword, 
    passwordsalt_  => v_Salt, 
    email_   => p_Email, 
    passwordquestion_ => null, 
    passwordanswer_ => null, 
    isapproved_  => 1, -- true 
    currenttimeutc => v_Now, 
    createdate_  => v_Now, 
    uniqueemail  => 1, -- true 
    passwordformat_ => 1, -- 0 = 'Clear', 1 = 'Hashed', 2 = 'Encrypted' 
    userid_   => v_UserID -- out parameter 
); 

END CreateUser;