ロールベースの資格認定と認可
11147 ワード
今日は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
ダウンロード は のとおりです.