# Hangfire 讀取不同server資料夾遇到檔權限問題 ## 時空背景 實作了一個可以讀取某server資料夾檔案的功能,寫了一個service,此service有兩種trigger方式 :::info T1. Hangfire定時trigger。 T2. User於網頁上按下按鈕trigger。 ::: 程式有一個專屬帳號並使用該帳號登入server讀取資料夾檔案,這邊以A帳號代稱 ## 問題描述與處理流程 在Local端測試兩種trigger方式時,都能正常執行,並成功讀取到資料夾。 但只要發佈到server之後,T1方式(Hangfire定時trigger)會讀取失敗,T2方式(User於網頁上按下按鈕trigger)讀取成功。 :::danger * 錯誤訊息為Authorization has been denied for this request. ::: 首先 先找出hangfire登入的帳號與User trigger的有何不同,之後發現由T2方式trigger時,網頁使用==A帳號==登入資料夾,但由hangfire tigger時網頁使用==IIS APPPOOL\DefaultAppPool==登入,因此帳號沒有該資料夾存取權限所以被拒絕。 ## 解決方式 :::success 在service中加入模擬使用者登入的程式碼,導入SimpleImpersonation套件 ::: 程式碼如下: ```csharp= using System.Security.Principal; using Microsoft.Win32.SafeHandles; using SimpleImpersonation; ``` ```csharp= UserCredentials credentials = new UserCredentials(domain, username, password); using (SafeAccessTokenHandle userHandle = credentials.LogonUser(LogonType.NewCredentials)) { WindowsIdentity.RunImpersonated(userHandle, () => { var AllDirector = Directory.EnumerateDirectories($@"XXXXX\XXXX\XXX", "*", SearchOption.AllDirectories).ToList(); //做你想做的事情 }); } ``` 此方式可以在讀取資料夾之前使用想使用的帳號密碼登入讀取。 ## 參考資料 * https://github.com/mattjohnsonpint/SimpleImpersonation
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up