2015-02-07 108 views
9

有很多關於在c#中模擬用戶的例子,但是你必須提供該用戶的域名,用戶名和密碼。ASP.NET MVC 5成員冒充特定用戶

我需要的是有點不同。如果我們使用成員ASP.NET MVC 5開發應用,假設我們已經制定了以下角色:

  • 聯繫
  • 用戶
  • 遊客

和用戶誰屬不同的角色。

現在,如果從角色User用戶與應用程序的一些問題,我怎麼能允許Admin角色的用戶來模擬特定用戶,而沒有特定的用戶給管理員用戶名和密碼?

最重要的是,Admin應該能夠模擬應用程序中的任何用戶,並能夠以用戶自己的身份瀏覽應用程序。

這是可能在MVC中實現嗎?

有很多應用程序提供這種可能性,其中之一就是Salesforce。 Salesforce中的管理員可以模擬任何用戶,並以用戶自己的身份瀏覽/查看應用程序。這將使他們能夠識別和解決應用程序中可能出現的問題。

+1

查看我的博客文章:http://tech.trailmax.info/2014/06/user-impersonation-with-asp-net-identity-2/ – trailmax 2015-02-08 15:10:06

回答

6

現在,如果從角色中的用戶,用戶與應用程序的一些問題,如何 我可以允許管理員角色的用戶來模擬特定用戶, 不特定用戶給管理員自己的用戶名和 密碼? ...這是可能在MVC中實現嗎?

這可以在不知道要模擬的用戶的密碼的情況下完成,但您必須知道要模擬的用戶的用戶名。

您可以用下面的正常使用窗體身份驗證做到這一點:

FormsAuthentication.SetAuthCookie("username-to-be-impersonated", false); 

當然你想保護進入的代碼塊,因此,只有管理員可以做模擬。您可能想要執行其他操作,例如在會話或cookie中保存管理員用戶的用戶名,以幫助系統知道正在進行模擬,並在用戶完成模擬時爲用戶提供反向功能。底線是,所有會員系統關心的是auth cookie,您可以在不知道用戶密碼的情況下爲任何用戶名寫一個auth cookie。

該過程對於ASP.NET身份2來說是相同的,區別在於您如何編寫auth cookie。注意下面的代碼是a snippet based on the comment that @trailmax left in the OP

// assume you already have references to a UserManager and HttpContext 
var userToImpersonate = await userManager 
    .FindByNameAsync(userNameToImpersonate); 
var identityToImpersonate = await userManager 
    .CreateIdentityAsync(userToImpersonate, 
     DefaultAuthenticationTypes.ApplicationCookie); 
var authenticationManager = httpContext.GetOwinContext().Authentication; 
authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
authenticationManager.SignIn(new AuthenticationProperties() 
{ 
    IsPersistent = false 
}, identityToImpersonate); 

你也應該有一個政策,可以讓你有一個管理員模擬其帳戶之前,以某種方式獲取用戶的權限。

+0

聽起來不錯!當然,這些要求稍微複雜一些,通過檢查管理員是否真的是管理員,並且管理員無法在沒有用戶權限的情況下模擬用戶,所有模擬都將正確完成。基本上是這樣的:'我是這個應用程序的用戶,我有一個問題!我允許管理員角色冒充我並檢查/查看我可以看到的問題!管理員角色用戶可以模擬該特定用戶。用戶可以取消模擬權限,並可以設置模擬日期和時間,就像下一個4h一樣。' – 2015-02-10 16:19:27

+1

@DavidDury然後它聽起來像你只是在尋找如何編寫身份驗證cookie。就MVC而言,只要識別用戶並設置Controller.User IPrincipal實例即可。你只需要知道用戶名來設置這個cookie,而不是密碼。 – danludwig 2015-02-10 16:45:50

+0

Yeap,這是正確的。那部分有點「黑洞」。感謝您和@trailmax的博客文章! – 2015-02-10 19:48:18

3

我不認爲解決方案在於會員制度本身。我可能會在應用程序邏輯中實現模擬。會員系統會告訴您用戶的身份和他們擁有的角色,但您的應用程序可以隨意忽略或解釋這些角色。

編輯:爲了詳細...

你可以看一下這個不是與會員的問題,而只是作爲一套內置到應用程序的功能。管理員可以通過成爲管理員來查看用戶看到的內容 - 這是構建到應用程序邏輯中的。

試圖將該功能侵入到會員系統中,以至於應用程序以某種方式被愚弄爲將管理員視爲不同的成員似乎很詭異 - 並且任何會員系統的濫用都會打開安全漏洞。

如果你真的想要走這條路線,也許你應該考慮給予管理員短期的與他們的IP地址綁定的令牌,說10分鐘,讓他們登錄任何人 - 再次這不是綁定成員 - 它是捆綁的到可以分解的密碼檢查。

所以我在這裏沒有真正給出解決方案 - 只是暗示它不會在黑客入侵系統中被發現。如果你這樣做,那麼你削弱了會員制度的安全性,但是你也限制了你能達到的目標。例如,您可能想向管理員顯示用戶所看到的信息+一些額外的診斷信息 - 如果應用程序認爲管理員是用戶,該如何工作?

+0

你能詳細解釋一下你的答案嗎? – 2015-02-07 21:11:58

+0

我不同意這可能很冒險,並且如果正確完成,它不會削弱會員系統的安全性。有時候這樣的功能對於查看另一個非管理員用戶看到的內容非常有幫助。如果您在路由中使用用戶名或用戶標識符進行操作,則可能需要執行此操作,因爲通常沒有一種好方法可以使用不同的用戶名或用戶標識將這些操作打開到管理員用戶。 – danludwig 2015-02-09 13:52:35

0

我所做的只是在會話中傳遞當前用戶標識並在整個應用程序中讀取會話。如果當前登錄的用戶與我知道模擬正在進行的會話對象不同。我在會話開始時將所有這些設置在global.asax文件中。似乎很適合我的應用程序。