2012-05-24 103 views
9

我正在使用Visual Studio 2011測試版來開發一個新的asp.net mvc4項目,並且試圖讓我的頭部圍繞整個安全事物。這是一個內部Intranet應用程序,最初將使用單點登錄,因此用戶不會被提示輸入Windows ID /密碼。該公司有一個自定義應用程序用於存儲不同應用程序的角色,並可通過存儲過程調用進行訪問。它將獲取用戶的登錄ID並返回某種包含角色的集合,例如「MyApp.Data」,「MyApp.User,」MyApp.Admin「。那麼這是指什麼 - 這是一個自定義的會員提供商,自定義角色提供商或其他東西?ASP.NET MVC4安全,身份驗證和授權

我一直在閱讀所有授權,身份驗證,成員資格,角色等等的內容和我目前看不到樹的木材。我讀過現有的ASP.NET安全對象已經過嘗試和測試,並且除非有非常複雜的要求,那麼內置的就足夠了,所以我很樂意使用已經存在的內容。

所以,如果用戶已經登錄到網絡,這意味着他們被認證 - 正確嗎?如果是這樣那麼我只需要實現Authorization。是否有必要使用Authorize屬性來修飾每個Controller或Action?如果是這樣的話如果我從我的自定義角色存儲應用中檢索角色,[Authorize(Roles =「ABC」)]的「ABC」部分會被設置?

我讀了幾篇文章和博客文章包括本喬恩加洛韋但我迷路了接近尾聲:

Customizing Authentication and Authorization The Right Way

這麼多的問題,如果還有人的有多好,高層次的描述知道所有這一切都掛在一起,然後我都耳朵:)

回答

8

在沒有答案的好實例掛起在一起我想我會潦草下來我發現至今:

所以在Global.asax中我想補充:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new System.Web.Mvc.AuthorizeAttribute()); //new 
} 
  • 一旦用戶通過驗證然後我需要照顧授權。該公司有一個現有的全球數據存儲庫,用於角色,我不會更新訪問權限,只能讀取訪問權限,因此我可以通過存儲的proc調用爲特定用戶檢索角色。在請求完成後,服務檯可能需要幾天到幾個星期才能創建角色,所以出於這個原因,最初會創建2個標準角色,用戶和管理員以及後續角色將存儲在我們的應用程序數據庫中。

  • 除了這兩個標準角色之外,還需要後續角色,如超級用戶等。這些角色根據業務規則等具有各種權限,並且需要存儲在我們的應用程序數據庫中。因此,對於這種情況,我需要創建一個自定義角色提供程序,將相應的asp.net角色表添加到我的應用程序數據庫,並將其插入到web.config中。這裏的標題管理授權的毫秒頁面使用我挑選出位的角色:

    http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx

  • 從我至今讀我需要一個自定義的角色提供的僅有的表就是角色和UsersInRoles 。

    CREATE TABLE角色 ( ROLENAME文本(255)NOT NULL, 應用程序名的文本(255)NOT NULL, 約束PKRoles PRIMARY KEY(ROLENAME,應用程序名稱) )

    CREATE TABLE UsersInRoles ( 用戶名文本(255)NOT NULL, 角色名稱文本(255)NOT NULL, ApplicationName文本(255)NOT NULL, CONSTRAINT PKUsersInRoles PRIMARY KEY(用戶名,角色名,應用程序名稱) )

  • 一旦完成所有這些設置,我需要弄清楚如何將全局數據存儲中的2個標準角色(用戶和管理員)與存儲在我的應用數據庫中的自定義角色進行合併,並且如果我可以使用(例如)[授權(角色=「管理員,超級用戶」)]在一個控制器/操作,或者如果我需要繼承AuthoriseAttribute並做更聰明的事情。

  • 我剛剛意識到,當我使用AD進行身份驗證時,我需要添加/注入當前用戶所屬角色集合的方法。因此,雖然我不需要任何自定義成員資格提供程序功能,但仍需與httpContext.User進行交互以更新其Roles集合。

+2

你真的很高興花時間把這樣一個很好的答案。謝謝。 –

+0

@EduardoRascon沒問題,很高興你發現它很有用 –

7

如果您的身份驗證已被Windows(我通過Active Directory猜測)處理,那麼你要找的是一種授權機制,將角色用戶。您擁有的一個選項是成功地將用戶角色加載到當前會話中。然後創建一個自定義的授權屬性,它會檢查當前會話有你與

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited=true, AllowMultiple=true)] 
public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    {   
     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) 
     { 
      return false; 
     } 

    //check your users against a database and return true or false 
     return base.AuthorizeCore(httpContext); 
    } 
} 

工作然後你可以用屬性這樣

[CustomAuthorization] 
public ActionResult SomeAction() 
{ 
    return View(); 
} 

更新必要的角色

AuthorizeCore是將用於檢查是否允許該用戶訪問各自的Action Method的方法。在這個方法中,你可以檢查你的數據庫的httpContext.User.Identity.Name屬性或你的角色的存儲位置。如果你通過Active Directory使用Windows身份驗證,HttpContext.User.Identity應該是,讓這一切是如何的高級視圖的WindowsIdentity

+0

嗨感謝。該公司使用Active Directory進行用戶管理/登錄等,但他們有一個單獨的應用程序,可處理各種窗口和Web系統的角色管理。這將返回給定用戶的角色列表,並通過存儲過程調用。我看過有關定製授權屬性的文章,因此可能會這樣做,但我想找到一個關於如何將整個事件掛在一起的高級指南。 –

+0

還什麼AuthorizeCore做...我怎麼用它來「檢查用戶對數據庫」? –

1

您的RolePrincipal與您的RoleProvider協同更新應該是獲取與經過身份驗證的用戶關聯的角色列表所需的全部內容。請記住,RolePrincipal將已經包含正確的WindowsIdentity。

您不需要自定義的授權屬性。 RolePrincipal/RoleProvider將獲取所需的角色並使用標準的Authorize屬性。

什麼似乎有點奇怪的是,你想擁有獨特的角色,你的應用程序,但你說你也想與該Windows用戶從一個獨立的企業店以及相關聯的角色。如你所說,你想合併它們。這對我來說並不合適。要麼爲公司級別管理應用程序的角色,要麼希望在本地級別管理角色。一般你不會這樣做。

但如果真的是你想要做什麼,那麼它聽起來好像你RoleProvider需要做出服務(如WCF)呼叫或呼叫廣告,以獲得更多的信息。也許窗口用戶所屬的「組」的名稱可以充當「角色」。然後,您將只篩選應用程序關心的那些組,並將其與您在本地角色數據庫中找到的角色結合使用。

一旦所有的信息已被收集,一定有roleManager指示在cookie存儲角色信息。用戶做出的每一個請求都沒有意義去理解這個hullabaloo。