ロールベースの資格認定と認可



今日はcodeprojectの上の文章を見て、いい感じです.著者らは主にform authenticationを用いてロールベースの認証を実現した.機能はまずまずで、基本的にMSのメンバーシップに代わることができますが、メンバーシップほど膨大ではありません.基本的な応用をするには十分です.
 
 
大まかな内容を訳して、大意は以下のように記録します:
 
著者らは,ユーザを追加し,ユーザにロールを指定し,ロールを削除し,ロールを管理する4つのページを実現した.

The Classes Overview


There are 4 classes: User , Role , SitePrincipal and SiteIdentity . I would like to overview the classes' methods and properties here:

The User class


  User()
Default parameter less constructor to create a new user
  User(int userID)
This constructor gets a userID and looks up the user details from the database
  User(string email)
This constructor gets an email and looks up the user details from the database
  GetUsers()
This method returns a DataSet of all the users available in the database
  GetRoles()
This method returns a DataSet of roles assigned to the current user
  GetUserRoles(int userID)
This static method grabs the userID and returns a roles ArrayList assigned to that user
  AddToRole(int roleID)
This method assigns a role to the current user
  RemoveFromRole(int roleID)
This method removes current user from the role that has been passed by the roleID .
  Add()
Adds a new user to the database
  Update()
Updates current user information
  Delete()
Deletes current user
  UserID
Gets/Sets user's id number
  FullName
Gets/Sets user's full name
  Email
Gets/Sets user's email
  Password
Gets/Sets user's password
  Biography
Gets/Sets user's biography
  DateAdded
Gets/Sets user's registering date

The Role class


  Role()
Default parameter less constructor to create a new role
  Role(int roleID)
This constructor gets a roleID and looks up the role details from the database
  GetRoles()
This method returns a DataSet of all roles available in the database
  Add()
Adds a new role to the database
  Update()
Updates current role information
  Delete()
Deletes current role
  RoleID
Gets/Sets role ID number
  RoleName
Gets/Sets role name

The SitePrincipal class (implements the IIPrincipal Interface)


  SitePrincipal(int userID)
This constructor gets a userID and looks up details from the database
  SitePrincipal(string email)
This constructor gets an email and looks up details from the database
  IsInRole()
( IIPrincipal.IsInRole() ) Indicates whether a current principal is in a specific role
  ValidateLogin()
Adds a new user to the database
  Identity
( IIPrincipal.Identity ) Gets/Sets the identity of the current principal
  Roles
Gets the roles of the current principal

The SiteIdentity class (implements the IIdentity Interface)


  SiteIdentity(int userID)
This constructor gets a userID and looks up the user details from the database
  SiteIdentity(string email)
This constructor gets an email and looks up the user details from the database
  AuthenticationType
( IIdentity.AuthenticationType ) Always returns "Custom Authentication "
  IsAuthenticated
( IIdentity.IsAuthenticated ) Always returns true
  Name
( IIdentity.Name ) Gets the name of the current user
  Email
Gets the email of the current user
  Password
Gets the password of the current user
  UserID
Gets the user ID number of the current user

Enabling Forms Authentication


ASPを実現するために.NET Forms認証、web.configファイルの構成は次のとおりです.
<configuration>
     <system.web>
      <authentication mode="Forms">
            <forms name="RolesBasedAthentication" 
                path="/" 
                loginUrl="/Login.aspx" 
                protection="All" 
                timeout="30">
            </forms>
         </authentication>
     </system.web>
</configuration>

 
formsのnameプロパティはブラウザのクッキーの名前を指定し、デフォルトの名前は.aspxauthですが、同じサーバにいくつかのアプリケーションがある場合は、異なる名前が必要です.loginurlはログインページです.timeoutはクッキーの有効時間を指定し、単位は分です.もちろん、保存するクッキーには無効です.protectionはクッキーの保存方法です.allはデータが暗号化され検証されることを意味します.他に指定できる値は、none、encryption、validationです.
 
フォーム認証が指定されると、ユーザーがページを要求するたびに、フォームはブラウザのクッキー値をチェックします.見つかった場合、user identifyはFormsIdentityクラスとしてクッキーに保存されます.このクラスには認証ユーザーの次の情報が含まれています.
  • AthenticationType - returns the value Forms
  • IsAthenticated - returns a boolean value indicating where the user was authenticated
  • Name - Indicates the name of an authenticated user

  • FormsIdentityクラスにはユーザーのname属性しか含まれていないため、Nameだけでなく多くの情報が必要になります.そこで私はこのSiteIdentityクラスを書きました.それはIidentityインタフェースを実現し、認証ユーザーの詳細を含んでいます.
     

    Creating the Login Page


    ログインページには2つのテキストボックスがあり、ユーザーに電子メールとパスワードを入力させることができます.オプションボックスを置いて、ユーザーに永続的なクッキーを維持するかどうかを選択させ、最後にsubmitボタンを置いて、Onclickイベントは以下のように処理されます.
    private void Submit_Click(object sender, System.EventArgs e)
    {
          // call the ValidateLogin static method to
          // check if the email and password are correct
          // if correct the method will return a new user else return null
          SitePrincipal newUser = 
            SitePrincipal.ValidateLogin(Email.Text, Password.Text);
    
        if (newUser == null)
        {
            ErrorMessage.Text = "Login failed for " + Email.Text;
            ErrorMessage.Visible = true;
        }
        else
        {
            // assign the new user to the current context user
            Context.User = newUser;
            // set the cookie that contains the email address
            // the true value means the cookie will be set persisted
            FormsAuthentication.SetAuthCookie( Email.Text, true ); 
            // redirect the user to the home page
            Response.Redirect("Default.aspx");
        }
    }
    

     
     

    Authenticating User On Every Request


    主に、すべてのページを継承するベースクラスが実装されています.継承されたすべてのページには、カスタムSiteProcipalインスタンス情報が含まれています.
    public class PageBase: System.Web.UI.Page
    {
        public PageBase()
        {
        }
    
        protected override void OnInit(EventArgs e)
        {    
            base.OnInit(e);
            this.Load += new System.EventHandler(this.PageBase_Load);
        }    
    
    
    
        private void PageBase_Load(object sender, System.EventArgs e)
        { 
          if (Context.User.Identity.IsAuthenticated) 
          {
            if (!(Context.User is SitePrincipal))
            {
                  SitePrincipal newUser = 
                    new SitePrincipal( Context.User.Identity.Name );
                  Context.User = newUser;
                }    
        }
        }
    }

     
    以降、すべてのページがSystemではなくこのページから継承されます.Web.UI.Pageですので、このときユーザーの情報を入手したい場合は簡単です.
    if (Context.User.Identity.IsAuthenticated) 
    {
        string name = ((SiteIdentity)Context.User.Identity).FullName;
        string email = ((SiteIdentity)Context.User.Identity).Email;
        string password = ((SiteIdentity)Context.User.Identity).Password;
        string userID = ((SiteIdentity)Context.User.Identity).UserID;
    }
     
     
    

     

    if (Context.User.Identity.IsAuthenticated) 
    {
        // if user is not in the Site Admin role,
        // he/she will be redirected to the login page
        if (!((SitePrincipal)Context.User).IsInRole("Site Admin"))
            Response.Redirect("Login.aspx");
    }

    The Demo Application


    ダウンロード は のとおりです.