본문 바로가기
ASP.NET

[ASP.NET] NAS 영역 접근 identity impersonate 사용 한 사례

by Hwoarang757 2021. 11. 8.

[ASP.NET] NAS 영역 접근 identity impersonate 사용 한 사례

 

WebSite Behind Code [ aspx.cs ] 페이지에서 , NAS [ Network Access Strorage ] 에 접근이 필요 한 케이스 였고

 

NAS에 인증 부분은 UserID 와 , Password를 이용한 인증 방식 이었습니다. 

 

WINAPI 함수를 이용하여 접근 시에 , NAS 영역에 정상적으로 Access가 되나 , NAS 영역에 디렉터리 생성 시에는 권한 관련 오류가 발생 하였습니다. 

 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]         
    public struct NETSOURCE         
    {             
        public uint dwScope;
        public uint dwType;
        public uint dwDisplayType;
        public uint dwUsage;
        public string IPLocalName;
        public string IPRemoteName;
        public string IPComment;
        public string IPProvider;
    }          

	[DllImport("mpr.dll", CharSet = CharSet.Auto)]
    public static extern int WNetUseConnection
    (
        IntPtr hwndOwner,
        [MarshalAs(UnmanagedType.Struct)] ref NETSOURCE IPNetResource,
        string IPPassword,
        string IPUserID,
        uint dwFlags,
        StringBuilder IPAccessName,
        ref int IPBufferSize,
        out uint IPResult
    );
    
    internal string setRemoteConnection(string strRemoteConnectString, string strRemoteUserID, string strRemotePWD)
    {
        int capacity = 64;
        uint resultFlags = 0;
        uint flags = 0;
        try
        {
            if ((strRemoteConnectString != "" || strRemoteConnectString != string.Empty) &&
                (strRemoteUserID != "" || strRemoteUserID != string.Empty) &&
                (strRemotePWD != "" || strRemotePWD != string.Empty))
            {
                StringBuilder sb = new StringBuilder(capacity);
                NETSOURCE ns = new NETSOURCE();
                ns.dwType = 1;    //공유디스크
                ns.IPLocalName = null;    //로컬 드라이브 지정하지 않음
                ns.IPRemoteName = @strRemoteConnectString;
                ns.IPProvider = null;
                int result = WNetUseConnection(IntPtr.Zero, ref ns, strRemotePWD, strRemoteUserID, flags, sb, ref capacity, out resultFlags);
                if (result == 0)
                {
                    //Successfully connected to a network drive
                    return "네트워크 드라이브가 성공적으로 연결되었습니다.";
                }
                else
                {
                    //Unable to connect to a network drive. Please check your connection information.
                    return "네트워크 드라이브를 연결할 수 없습니다.\n연결 정보를 확인하세요..";
                }
            }
            else
            {
                //Network drive connection information is incorrect
                return "네트워크 드라이브 연결 정보가 올바르지 않습니다.";
            }
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }

 

해당 함수를 호출 한 후에도 디렉터리를 생성 시에는 권한 관련 오류가 발생 하였으며 , IUSR_ [인터넷 정보 서비스 계정 ] 로 시작하는 계정으로 실제 NAS 영역에 접근이 되는 걸로 Exception 의 내용을 확인 할 수 있었습니다. 

 

추가 조치 사항은 , 해당 IIS 운영중인 Windows Server에 NAS 에 Access 하는 동일한 Windows 계정을 생성 하였으며 , [패스워드 동일 하게 ] 

 

Web.config에 System.web 노드의 하위 부분에 아래 사항을 추가 한 후 정상적으로 NAS 영역에 디렉터리 생성처리가 정상적으로 진행 되었습니다.

 <system.web> 
 	<identity impersonate="true" userName="userid" password="password" />
 </system.web>