2008-10-17 11 views
6

Tôi có sau trong web.config của tôi:Trong lớp codebehind của tôi, làm cách nào để truy xuất các vai trò được ủy quyền?

<location path="RestrictedPage.aspx"> 
    <system.web> 
     <authorization> 
      <allow roles="Group1Admin, Group3Admin, Group7Admin"/> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 
</location> 

Trong RestrictedPage.aspx.cs, làm thế nào để lấy lại vai trò thu thập được phép có chứa Group1Admin, Group3Admin, và Group7Admin?

Đây là lý do tôi hỏi:

Web.config đang xử lý ủy quyền cho trang. Điều đó hoạt động tốt. Nhưng tôi sẽ có một vài trong số các trang này (nói RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). Mỗi trang này sẽ có bộ điều khiển web tùy chỉnh của tôi trên đó. Và mỗi trang trong số các trang này sẽ có các vai trò được cho phép khác nhau. Webcontrol của tôi có một danh sách thả xuống. Các lựa chọn trong trình đơn thả xuống phụ thuộc vào giao điểm của vai trò của người dùng và các vai trò được cho phép của trang.

Như đã đề cập bên dưới, tìm kiếm trên web.config bằng XPath có thể sẽ hoạt động. Tôi đã chỉ hy vọng cho một cái gì đó nhiều framework-y. Loại giống như SiteMap. Khi tôi đặt các vai trò trong web.sitemap của mình, tôi có thể lấy chúng bằng SiteMap.CurrentNode.Roles (trang web của tôi đang sử dụng xác thực Windows, vì vậy tôi không thể sử dụng web.sitemap để bảo mật và tôi muốn duy trì vai trò chỉ trong một tập tin).

Trả lời

3
// set the configuration path to your config file 
string configPath = "??"; 

Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath); 

// Get the object related to the <identity> section. 
AuthorizationSection section = (AuthorizationSection)config.GetSection("system.web/authorization"); 

từ đối tượng phần được đối tượng AuthorizationRuleCollection nơi bạn sau đó có thể trích xuất các Vai trò.

Lưu ý: Có thể bạn sẽ cần phải sửa đổi đường dẫn đến phần một chút kể từ khi bạn bắt đầu với "location path =" RestrictedPage.aspx "", tôi đã không thử kịch bản đó.

+0

Hoàn hảo! Đây là dòng cuối cùng của tôi: Uỷ quyềnSection section = (AuthorizationSection) WebConfigurationManager.GetSection ("system.web/authorization", Request.Path); Yêu cầu.Điều hướng đến vị trí = "RestrictedPage.aspx" (khi đó là trang hiện tại). Cảm ơn! –

+0

Để lấy web.config hiện tại, cho biến configPath - hoặc thay thế nó bằng hoặc đặt nó thành "~" như được mô tả trong câu trả lời này [ở đây] (http://stackoverflow.com/a/4134213/603807) – dyslexicanaboko

0
if {User.IsInRole("Group1Admin"){//do stuff} 

Đó có phải là yêu cầu của bạn không?

0

Tôi không chắc chắn, nhưng tôi đã nghĩ rằng điều này được kiểm tra trước khi trang của bạn được xử lý, vì vậy nếu người dùng không có vai trò, họ sẽ không bao giờ tiếp cận trang của bạn. Mà cuối cùng sẽ làm cho khả năng hiển thị này dư thừa trong trang.

+1

Nhưng nếu người dùng IS thuộc một trong các vai trò được ủy quyền, bạn có thể vẫn muốn biết vai trò của họ, phải không? – DOK

0

Tôi tin rằng có cách tốt hơn để đọc thông tin này, nhưng đây là cách bạn có thể đọc các giá trị cho phép từ tệp web.config.

XmlDocument webConfigReader = new XmlDocument(); 
webConfigReader.Load(Server.MapPath("web.config")); 

XmlNodeList root = webConfigReader.SelectNodes("//location[@path="RestrictedPage.aspx"]//allow//@roles"); 

foreach (XmlNode node in root) 
{ 
    Response.Write(node.Value); 
} 

Tất nhiên, nhà cung cấp vai trò ASP.NET sẽ xử lý việc này cho bạn, vì vậy đọc các giá trị duy nhất là thực sự có liên quan nếu bạn có kế hoạch để làm điều gì đó với họ trong code-behind bên cạnh người sử dụng cho phép, mà bạn có thể đang làm.

Hy vọng điều này sẽ giúp - bạn có thể phải chia kết quả của mình bằng ký tự,.

0

gì thường xảy ra là thế này ...

Khi người dùng nhấn trang của bạn, nếu xác thực/giấy phép đang hoạt động, sự kiện Application_Authentication được nâng lên. Trừ khi bạn đang sử dụng Windows Authentication đối với một cái gì đó như Active Directory, các đối tượng IPrincipal và Identity sẽ không có sẵn cho bạn, vì vậy bạn không thể truy cập vào phương thức User.IsInRole(). Tuy nhiên, bạn có thể làm điều này bằng cách thêm đoạn mã sau vào file Global.asax của bạn:

Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) 

     Dim formsAuthTicket As FormsAuthenticationTicket 
     Dim httpCook As HttpCookie 
     Dim objGenericIdentity As GenericIdentity 
     Dim objMyAppPrincipal As CustomPrincipal 
     Dim strRoles As String() 

     Log.Info("Starting Application AuthenticateRequest Method...") 

     httpCook = Context.Request.Cookies.Get("authCookieEAF") 
     formsAuthTicket = FormsAuthentication.Decrypt(httpCook.Value) 
     objGenericIdentity = New GenericIdentity(formsAuthTicket.Name) 
     strRoles = formsAuthTicket.UserData.Split("|"c) 
     objMyAppPrincipal = New CustomPrincipal(objGenericIdentity, strRoles) 
     HttpContext.Current.User = objMyAppPrincipal 

     Log.Info("Application AuthenticateRequest Method Complete.") 

End Sub 

Điều này sẽ đặt một cookie vào phiên trình duyệt với người sử dụng và vai trò của thông tin thích hợp, bạn có thể truy cập vào các ứng dụng web.

Lý tưởng nhất, người dùng của bạn sẽ chỉ có một vai trò trong một ứng dụng, vì vậy tôi tin rằng đó là lý do tại sao bạn có phương pháp kiểm tra vai trò có sẵn cho bạn. Nó sẽ là đủ dễ dàng để viết một phương thức helper cho bạn rằng sẽ lặp qua danh sách các vai trò trong việc áp dụng và thử nghiệm để xem vai trò gì họ đang có trong.