2012-06-22 1 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에 대한 유일한 out 매개 변수는 userid이므로 상태 값에 액세스 할 수 있습니까?

내가 주로 시도한 것이지만 T-SQL에서 this answer을 찾았습니다. PL-SQL에서이 작업을 수행해야하며 가능한 경우 사용자가 성공적으로 만들어 졌는지 확인해야합니다.

답변

0

Reflector을 사용하면 MembershipCreateStatus 출력 매개 변수가 ASP.NET 함수의 일부인 것으로 나타났습니다. 따라서 Oracle 함수에서 비슷한 것을 원한다면 직접 작성해야합니다.

나는 해시를 제외하고 PL-SQL에서 작동하는 모든 것을 가지고, 그래서 동료는 자바 해싱 함수 작성 :

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; 
관련 문제