如何实现IPrincipal及实现自定义身份及权限认证?
[c-sharp]viewplaincopy
HttpContext.Current.User用户对象表示用户的安全上下文,代码当前即以该用户的名义运行,包括用户的标识(IIdentity)和它们所属的任何角色。所有用户对象都需要实现IPrincipal接口。(MSDN)
创建一个User类实现IIdentity接口重写相应的方法
publicclassUser:IIdentity
{
privateint_id;
privatestring_username;
privatestring_password;
privatebool_isAuthenticated;
#regionproperties
publicvirtualintId
{
get{returnthis._id;}
set{this._id=value;}
}
publicvirtualstringUserName
{
get{returnthis._userName;}
set{this._userName=value;}
}
publicvirtualstringPassword
{
get{returnthis._password;}
set{this._password=value;}
}
//是否通过认证
publicvirtualboolIsAuthenticated
{
get{returnthis._isAuthenticated;}
set{this._isAuthenticated=value;}
}
//重写为用户ID
publicvirtualstringName
{
get
{
if(this._isAuthenticated)
returnthis._id.ToString();
else
return"";
}
}
publicvirtualstringAuthenticationType
{
get{return"CuyahogaAuthentication";}
}
publicUser()
{
this._id=-1;
this._isAuthenticated=false;
}
}
创建一个CuyahogaPrincipal类实现IPrincipal接口
publicclassCuyahogaPrincipal:IPrincipal
{
privateUser_user;
//返回一个现实IIdentity接口的user对象
publicIIdentityIdentity
{
get{returnthis._user;}
}
//当前用户是否属于指定角色在以后的权限认证中可以使用也可以使用User类中的相关方法来代替
publicboolIsInRole(stringrole)
{
foreach(RoleroleObjectinthis._user.Roles)
{
if(roleObject.Name.Equals(role))
returntrue;
}
returnfalse;
}
///初始化若user通过授权则创建
publicCuyahogaPrincipal(Useruser)
{
if(user!=null&&user.IsAuthenticated)
{
this._user=user;
}
else
{
thrownewSecurityException("Cannotcreateaprincipalwithoutuvaliduser");
}
}
}
创建一个实现IHttpModule的AuthenticationModule类
publicclassAuthenticationModule:IHttpModule
{
privateconstintAUTHENTICATION_TIMEOUT=20;
publicAuthenticationModule()
{
}
publicvoidInit(HttpApplicationcontext)
{
context.AuthenticateRequest+=newEventHandler(Context_AuthenticateRequest);
}
publicvoidDispose()
{
//Nothinghere
}
//登录时验证用户时使用
publicboolAuthenticateUser(stringusername,stringpassword,boolpersistLogin)
{
//数据访问类
CoreRepositorycr=(CoreRepository)HttpContext.Current.Items["CoreRepository"];
stringhashedPassword=Encryption.StringToMD5Hash(password);
try
{
//通过用户名密码得到用户对象
Useruser=cr.GetUserByUsernameAndPassword(username,hashedPassword);
if(user!=null)
{
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有