2012-01-23 13 views
1

現在、MVC3フレームワークを使用してアプリケーションを作成しています。ASP.NET MVC3ロール

[Authorize(Roles = "Admin")] 

私の質問です:私はロールを設定します

私のようなフィルタを用いてロールを使用する方法を理解できますか?ログインしていますか?これはどのように達成されますか?

+0

どのメンバーシッププロバイダーを使用していますか?組み込みプロバイダーのいずれかを使用しているのですか、フォーム認証チケットだけを使用していますか? –

+0

私はフォーム認証チケットを使用しています。アプリケーションは初めから構築されているため、メンバーシップ・プロバイダを認識していませんでしたか? –

答えて

6

フォーム認証チケットを自分で作成する場合は、通常、チケットのUserData部分を使用して、ユーザーに関連する情報を格納します。これは役割かもしれません。

次に、Application_AuthenticateRequestイベントのGlobal.asaxで、フォームチケットを解析し、現在のセキュリティプリンシパルにロールを割り当てます。ここで

は異なるプロバイダとフォーム認証のいくつかのガイドです:一般的に

http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx

私はすべてやって私自身のSystem.Security.Principal.GenericPrincipalとSystem.Web.Security.FormsIdentityを書くusualy私のために働く。

public class UserIdentity: System.Web.Security.FormsIdentity 
{ 
    public string[] Roles { get; private set; } 
    public string FirstName { get; private set; } 
    public string UserName { get; private set; } 
    public int UserID { get; private set; } 

    public UserIdentity(System.Web.Security.FormsAuthenticationTicket ticket) : base(ticket) 
    { 
     if (ticket.UserData != null && ticket.UserData.IndexOf("|") != -1) 
     { 
      string[] dataSections = ticket.UserData.Split('|'); 

      //Get the first name 
      FirstName = dataSections.Length >= 3 ? dataSections[2] : ""; 

      //Get the username 
      UserName = ticket.Name; 

      #region Parse the UserID 
      int userID = 0; 
      int.TryParse(dataSections[0], out userID); 
      this.UserID = userID; 
      #endregion 

      this.Roles = System.Text.RegularExpressions.Regex.Split(dataSections[1], ","); 

     } 
    } 
} 

public class UserPrincipal : System.Security.Principal.GenericPrincipal 
{ 
    public UserPrincipal(UserIdentity identity) : base(identity, identity.Roles) 
    { 
    } 
} 

そして、あなたのGlobal.asaxの中:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity is System.Web.Security.FormsIdentity) 
     { 

      HttpContext.Current.User = new CAA.Utility.Security.UserPrincipal(HttpContext.Current.User.Identity is CAA.Utility.Security.UserIdentity? HttpContext.Current.User.Identity as CAA.Utility.Security.UserIdentity : new Utility.Security.UserIdentity(((System.Web.Security.FormsIdentity)HttpContext.Current.User.Identity).Ticket));     


     } 
    } 

とチケットを書く:

   System.Web.Security.FormsAuthenticationTicket ticket = new System.Web.Security.FormsAuthenticationTicket(1, user.Username, DateTime.Now, DateTime.Now.AddDays(1), false, String.Format("{0}|{1}|{2}", user.UserID ,user.Roles.ToString(), user.FirstName), System.Web.Security.FormsAuthentication.FormsCookiePath); 
       HttpCookie cookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, System.Web.Security.FormsAuthentication.Encrypt(ticket)); 

       if (model.RememberMe) 
        cookie.Expires = ticket.Expiration; 


       Response.Cookies.Add(cookie); 

コードが続くのは難しいかもしれないが、ロジックが「という習慣であるのUserPrincipalフォームのAuthチケットのUserDataセクションに、そこに保存したい情報を自動解析します。私のケースでは、名前、役割、IDなどを格納しています。私のコードでは、名前空間 "CAA.Utility.Security"は私のカスタムIDとプリンシパルが格納されている場所です。

+0

完璧な、ちょうど私が探していた! –

2

ここで役割を設定しますか?

これは、web.configでどのロールプロバイダを使用しているかによって異なります。

<roleManager enabled="false"> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
    </providers> 
</roleManager> 

は、あなたがあなたのaspnet_Rolesテーブル内の役割を設定します。デフォルトAspNetSqlRoleProviderプロバイダを使用している場合。 following articleをご覧ください。しかし、カスタムロールプロバイダを使用している場合は、このプロバイダがどのように実装されているかによって異なります。