当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net forms身份验证,避免重复造轮子

ASP.NET
Asp.net 时间操作基类(支持短日期,长日期,时间差)
asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
asp.net 数据库备份还原(sqlserver+access)
Asp.Net 数据操作类(附通用数据基类)
Asp.net 弹出对话框基类(输出alet警告框)
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
Asp.net Socket客户端(远程发送和接收数据)
Asp.net 字符串操作基类(安全,替换,分解等)
Asp.Net数据输出到EXCEL表格中
asp.net Gridview里添加汇总行
asp.net UpdatePanel的简单用法
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
this connector is disabled错误的解决方法
sql事务应用积累
asp.net Page.Controls对象(找到所有服务器控件)
在asp.NET中字符串替换的五种方法
ASP.NET缓存方法分析和实践示例代码
asp.net 在DNN模块开发中遇到的resx怪问题
ASP.NET State service状态服务的问题解决方法
asp.net 结合mysql存储过程进行分页代码

ASP.NET 中的 asp.net forms身份验证,避免重复造轮子


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 199 ::
收藏到网摘: n/a

最近开始一个小 asp.net 项目,整个项目需要登录才能操作。以前大家都采用 asp 的方式 session + cookie 来实现身份验证,我一直对 asp.net 自带的 forms 验证早就耳闻,苦于没实践,今天刚好逮到机会实际应用一下。 问题:大家都说使用 forms 验证无法得到当前登录用户除了用户名之外的更多信息,经过我的一番小试验,在 forms 方式下自带的 userdata 可以为我们施展天地的地方。下面记录一下我的操作步骤备忘。
step 1: web.config 配置关键地方:
web.config配置
复制代码 代码如下:

<!--
通过 <authentication> 节可以配置 ASP.NET 用来
识别进入用户的
安全身份验证模式。
-->
<authentication mode="Forms">
<forms loginUrl="login.aspx" defaultUrl="index.aspx"
name=".ztinfozero" path="/Manager"
slidingExpiration="true" timeout="10"></forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>

step 2: 构造 SiteUser Model
复制代码 代码如下:

TopicUser Model
[Serializable]
public class TopicUser
{
public TopicUser() { }
model#region model
private System.Int32 _autoID;
/**//// <summary>
///
/// </summary>
public System.Int32 autoID
{
get { return _autoID; }
set { _autoID = value; }
}
private System.String _UserName;
/**//// <summary>
/// 用户名
/// </summary>
public System.String UserName
{
get { return _UserName; }
set { _UserName = value; }
}
private System.String _UserChName;
/**//// <summary>
/// 真实姓名
/// </summary>
public System.String UserChName
{
get { return _UserChName; }
set { _UserChName = value; }
}
private System.String _UserPass;
/**//// <summary>
///
/// </summary>
public System.String UserPass
{
get { return _UserPass; }
set { _UserPass = value; }
}
private System.String _DepartMent;
/**//// <summary>
///
/// </summary>
public System.String DepartMent
{
get { return _DepartMent; }
set { _DepartMent = value; }
}
private System.String _Duty;
/**//// <summary>
///
/// </summary>
public System.String Duty
{
get { return _Duty; }
set { _Duty = value; }
}
private System.Int32 _UserPermit;
/**//// <summary>
///
/// </summary>
public System.Int32 UserPermit
{
get { return _UserPermit; }
set { _UserPermit = value; }
}
private System.Int32 _Status;
/**//// <summary>
///
/// </summary>
public System.Int32 Status
{
get { return _Status; }
set { _Status = value; }
}
#endregion
}

step 3: 创建用户登录代码:
数据库-用户登录方法
复制代码 代码如下:

public TopicUser UserLogon(string username, string pass) {
string proc = "dbo.infozero_Proc_userLogOn";
Database db = DataFactory.userDB;
DbCommand cmd = db.GetStoredProcCommand(proc);
db.AddInParameter(cmd, "@username", DbType.String, username);
db.AddInParameter(cmd, "@userpass", DbType.String, pass);
db.AddOutParameter(cmd, "@result", DbType.Int32, 4);
DataSet ds = db.ExecuteDataSet(cmd);
TopicUser user = null;
int result = 0;
if (int.TryParse(db.GetParameterValue(cmd, "@result").ToString(), out result) )
user = tableToUser(ds.Tables[0]);
return user;
}
#region table to user
private TopicUser tableToUser(DataTable dt) {
TopicUser model = null;
if (dt.Rows.Count > 0) {
model = new TopicUser();
DataRow dr = dt.Rows[0];
int aid = 0;
int.TryParse(dr["autoID"].ToString(), out aid );
model.autoID = aid;
model.UserName = dr["UserName"].ToString();
model.UserChName = dr["UserChName"].ToString();
model.UserPass = dr["UserPass"].ToString();
model.DepartMent = dr["DepartMent"].ToString();
model.Duty = dr["Duty"].ToString();
if (dr["UserPermit"].ToString() != "")
{
model.UserPermit = int.Parse(dr["UserPermit"].ToString());
}
if (dr["Status"].ToString() != "")
{
model.Status = int.Parse(dr["Status"].ToString());
}
}
return model;
}
#endregion

step 4 : 创建登录页:
代码
复制代码 代码如下:

protected void btnOK_Click(object sender, EventArgs e)
{
string username = tbname.Text.Trim();
string pass = tbpass.Text.Trim();
if (!string.IsNullOrEmpty(username)) {
if (!string.IsNullOrEmpty(pass)) {
DataService.User b = new DataService.User();
DataService.TopicUser user = b.UserLogon(username, pass);
if (user != null) {
//roles , userid | userchname
string userdata = string.Format("{0},{1}|{2}",
user.UserPermit, user.autoID, user.UserChName);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
, username, DateTime.Now, DateTime.Now.AddHours(2),
true, userdata);
string encticket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, encticket);
Response.Cookies.Add(cookie);
Response.Redirect("Index.aspx");
}
}
}
}

step 5: 在 global.asax 里添加 Application_AuthenticateRequest 事件以设置当前登录用户的信息:
复制代码 代码如下:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpCookie cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null) {
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
if (ticket != null) {
string[] roles = ticket.UserData.Split(',');
FormsIdentity id = new FormsIdentity(ticket);
System.Security.Principal.GenericPrincipal principal = new GenericPrincipal(id, roles);
Context.User = principal;
}
}
}

step 6: 如何得到当前登录用户的信息
复制代码 代码如下:

public static TopicUser CurrentUser {
get {
DataService.TopicUser user = new DataService.TopicUser();
FormsIdentity identity = HttpContext.Current.User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = identity.Ticket;
string userdata = ticket.UserData; //获取自定义的 UserData 串
if (!string.IsNullOrEmpty(userdata)) {
if (userdata.IndexOf(',') > 0 && userdata.IndexOf('|') > 0)
{
//roles , userid | userchname
string uinfo = userdata.Split(',')[1];
string[] u = uinfo.Split('|');
int uid = 0;
int.TryParse(u[0], out uid);
user.autoID = uid;
user.UserChName = u[1];
user.UserName = HttpContext.Current.User.Identity.Name;
}
}
return user;
}
}

由此得到当前登录用户的 ID 为 UserBase.CurrentUser.autoID ; 真实名字是: UserBase.CurrentUser.UserChName ;
判断当前用户的角色是否为管理员: HttpContext.Current.User.IsInRole("1") ; // 1 为管理员
退出当前登录的方法:
LogOut.aspx
复制代码 代码如下:

protected void Page_Load(object sender, EventArgs e)
{
System.Web.Security.FormsAuthentication.SignOut();
Response.Write("<script>window.top.location='login.aspx';</script>");
Response.End();
}

至此,身份验证完成。我们不用费尽心思在四处堆放用户是否登录判断的代码了。