2010-05-01 193 views
2

我正在使用帶有自定義身份驗證機制的窗體身份驗證的ASP.NET網站(以編程方式在protected void Login_Authenticate(object sender, AuthenticateEventArgs e)上設置e.Authenticated)。ASP.NET中的自定義角色

我有一個ASP.NET站點地圖。某些元素只能顯示給登錄用戶。其他人必須只顯示給一個唯一的用戶(即管理員,用永遠不會改變的用戶名標識)。

我想避免什麼:

  • 設置自定義角色提供:太多的代碼編寫這樣一個基本的東西,
  • 改造現有的代碼,例如通過移除網站地圖,並通過替換它一個代碼隱藏解決方案。

我想要做什麼:

  • 一個純粹的代碼隱藏解決方案,這將讓我分配上進行身份驗證事件的作用。

這可能嗎?怎麼樣?如果沒有,是否有一個容易解決的解決方法?

回答

4

正如馬修所說,建立一個委託人並在恰當的時機設置它是利用所有基於角色的好東西(如SiteMap)的最簡單方法。

但是有一個比MSDN顯示更容易實現這個標準的方法。

這是我如何實現一個簡單的角色提供

的Global.asax

using System; 
using System.Collections.Specialized; 
using System.Security.Principal; 
using System.Threading; 
using System.Web; 
using System.Web.Security; 

namespace SimpleRoles 
{ 
    public class Global : HttpApplication 
    { 
     private static readonly NameValueCollection Roles = 
      new NameValueCollection(StringComparer.InvariantCultureIgnoreCase) 
       { 
        {"administrator", "admins"}, 
        // note, a user can be in more than one role 
        {"administrator", "codePoets"}, 
       }; 

     protected void Application_AuthenticateRequest(object sender, EventArgs e) 
     { 
      HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (cookie != null) 
      { 
       FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
       Context.User = Thread.CurrentPrincipal = 
           new GenericPrincipal(Context.User.Identity, Roles.GetValues(ticket.Name)); 
      } 
     } 
    } 
} 

要手動檢查用戶在頁面代碼隱藏的背景:

if (User.IsInRole("admins")) 
{ 
    // allow something 
} 

別處先手用戶關閉當前上下文

if (HttpContext.Current.User.IsInRole("admins")) 
{ 
    // allow something 
} 
2

我用這個技術,它Microsoft建議:

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

在全球ASAX我攔截權威性的cookie,然後設置線程原理和HttpContext的用戶和同一角色。在你可以使用HttpContext.Current.User.IsInRole(「foo」)之後,你可以在WinForm equivallent中使用這種類型的代碼。

您越是可以依賴內置模式,安全模式越可能會越安全,維護開發人員越可能識別如何使用模式。

相關問題