2016-09-19 22 views
5

設置模擬,我創建了一個非常簡單的項目,它試圖計算兩個目錄中文件的數量。 User1不允許訪問Directory2User2不允許訪問Directory1。由於模擬,我只能得到一個號碼,這取決於正在呼叫我的應用程序的用戶。這兩個用戶都設置爲管理員。爲了第一次理解,使用ASP.NET

因此,我在Visual Studio 2015(在Windows 8.1上運行)中創建了一個新的MVC項目,並選擇使用Windows身份驗證。一旦應用程序啓動並運行(在ISS Express中),我在我的機器上切換到User1(沒有Active Directory)並在Internet Explorer中調用網站(是,在設置中啓用了「集成Windows身份驗證」)。通過此設置,HttpContext.User.Identity中的用戶User1WindowsIdentity.GetCurrent()是我的開發用戶,是我在Visual Studio中使用的用戶。

我也嘗試手動模擬:「要麼未提供所需的模擬級別,或提供的模擬級別無效」

WindowsIdentity winId = (WindowsIdentity)User.Identity; 
WindowsImpersonationContext ctx = null; 
try 
{ 
    ctx = winId.Impersonate(); 

    // GetNumbers() tries to get the number of files for both directories  
    numbers = GetNumbers(); 
} 
catch (Exception e) 
{ 
} 
finally 
{ 
    if (ctx != null) 
    { 
     ctx.Undo(); 
    } 
} 

不幸的是,我得到的異常有些人聲稱這個人解決了他們的問題:https://kc.mcafee.com/corporate/index?page=content&id=KB56194不適合我。我已將User1和我自己的用戶添加到列表中並重新啓動計算機。不用找了。

唯一給我帶來一點希望的是使用單獨登錄的模仿,如https://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingusinglogonuser所述。缺點非常明顯:我必須擁有用戶密碼,如果用戶已經登錄爲我做了。

雖然這是不被我大的變化一個新的項目,只是爲了完整性檢查一些信息...

Web.config

<authentication mode="Windows" /> 
<authorization> 
    <deny users="?" /> 
</authorization> 

我的項目設置

  • 「匿名身份驗證」是false
  • 「Windows authenticat離子」是true
  • ‘管理pipline模式’Integrated

什麼改變,使這個簡單的項目按預期方式工作有什麼建議?

最好的問候, 卡斯滕

回答

3

我終於設法得到它的工作(IIS Express和IIS)!如上所述,第一種方法只是一個原型。最終目標是創建一個在服務器A上運行的GUI和一個在服務器B上運行的API。兩者都是用ASP.NET實現的。

GUI的Web.config和API得到了這些設置:

<system.web> 
    <authentication mode="Windows" /> 
    <authorization> 
    <deny users="?" /> 
    </authorization> 
    <identity impersonate="true" /> 
</system.web> 

項目屬性(按F4選擇項目後) 「管理pipline模式」 設置爲Classic

因此,我看到關於假冒是否應該與HttpClient一起工作的討論。據說,它的確如此。那麼,它不適合我。如果您使用各種HTTP方法,則WebClient並不好玩。所以我切換到RestSharp:

RestClient client = new RestClient(baseUrl); 
client.Authenticator = new NtlmAuthenticator(); 
  • 爲Visual Studio特別說明:您必須啓動Visual Studio作爲管理員或其他人冒充不會在IIS Express中!
  • IIS的特別注意事項:應用程序池必須使用Classic「管理管道模式」。
  • 特別說明(測試時):起初,API要求我進行身份驗證,但不應該這樣做。究其原因,很簡單:我自己的計算機上用戶user1有另一個密碼則user1我的目標機器上...

我希望這可以幫助別人。