Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
程序员文章站
2024-03-06 18:13:56
1、用户登录 验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,...
1、用户登录
验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码。
引入命名空间
using system.web.security;
users modeluser = new users() { id = 10000, name = username, username = username, password = password, roles = "admin" };//用户实体
string userdata = serializehelper.instance.jsonserialize<users>(modeluser);//序列化用户实体
//保存身份信息,参数说明可以看提示
formsauthenticationticket ticket = new formsauthenticationticket(1, username, datetime.now, datetime.now.addhours(12), false, userdata);
httpcookie cookie = new httpcookie(formsauthentication.formscookiename, formsauthentication.encrypt(ticket));//加密身份信息,保存至cookie
response.cookies.add(cookie);
现在身份信息就保存到cookie中了,如果有场景需要用到当前用户的用户id或者别的信息的时候该怎么办呢?
那么,我们重新在cookie中获取身份信息,然后解密,再反序列化成用户实体就ok了。
/// <summary>
/// 获取用户登录信息
/// </summary>
/// <returns></returns>
public users getuser()
{
if (httpcontext.current.request.isauthenticated)//是否通过身份验证
{
httpcookie authcookie = httpcontext.current.request.cookies[formsauthentication.formscookiename];//获取cookie
formsauthenticationticket ticket = formsauthentication.decrypt(authcookie.value);//解密
return serializehelper.instance.jsondeserialize<users>(ticket.userdata);//反序列化
}
return null;
}
2、权限验证
这里用到的是mvc中的action拦截器(重写onactionexecuting),在action执行之前会先运行拦截器中的代码。这里同时可以身份验证是否过期。
/// <summary>
/// 权限验证
/// </summary>
public class authattribute : actionfilterattribute
{
/// <summary>
/// 角色名称
/// </summary>
public string code { get; set; }
/// <summary>
/// 验证权限(action执行前会先执行这里)
/// </summary>
/// <param name="filtercontext"></param>
public override void onactionexecuting(actionexecutingcontext filtercontext)
{
//如果存在身份信息
if (!httpcontext.current.user.identity.isauthenticated)
{
contentresult content = new contentresult();
content.content = string.format("<script type='text/javascript'>alert('请先登录!');window.location.href='{0}';</script>", formsauthentication.loginurl);
filtercontext.result = content;
}
else
{
string[] role = checklogin.instance.getuser().roles.split(',');//获取所有角色
if (!role.contains(code))//验证权限
{
//验证不通过
contentresult content = new contentresult();
content.content = "<script type='text/javascript'>alert('权限验证不通过!');history.go(-1);</script>";
filtercontext.result = content;
}
}
}
}
那么在action中怎么去调用呢?这里贴出homecontroller中的代码来看下。
public class homecontroller : basecontroller
{
[authattribute(code = "admin")]//验证通过(这个action只允许admin查看)
public actionresult index()
{
users modeluser = checklogin.instance.getuser();
return view(modeluser);
}
[authattribute(code = "user")]//验证不通过
public actionresult index2()
{
return view();
}
[authattribute(code = "admin")]//验证通过,发生异常
public actionresult index3()
{
return view();
}
}
这样就可以把权限控制到action了。
3、异常处理
上面homecontroller并不是继承controller,而是继承我们自己定义的一个basecontroller,那么我们来看看basecontroller中有写什么东西?
[errorattribute]
public class basecontroller : controller
{
//所有controller都继承basecontroller,则都会进行异常捕获
}
在这里basecontroller只做了一件事情,就是增加了一个errorattribute的错误拦截器,那么只要是在controller中发生的异常都会在errorattribute中进行处理,你可以记录到数据库等操作。那么我们看看errorattribute是怎么工作的。
/// <summary>
/// 错误日志(controller发生异常时会执行这里)
/// </summary>
public class errorattribute : actionfilterattribute, iexceptionfilter
{
/// <summary>
/// 异常
/// </summary>
/// <param name="filtercontext"></param>
public void onexception(exceptioncontext filtercontext)
{
//获取异常信息,入库保存
exception error = filtercontext.exception;
string message = error.message;//错误信息
string url = httpcontext.current.request.rawurl;//错误发生地址
filtercontext.exceptionhandled = true;
filtercontext.result = new redirectresult("/error/show/");//跳转至错误提示页面
}
}
在这里可以把异常捕获,然后跳转到友好的错误提示页面。在mvc中几个操作就可以这样简单的完成了,关于代码在文章下面会提供下载。
实例代码
作者:lying.net
验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码。
引入命名空间
using system.web.security;
复制代码 代码如下:
users modeluser = new users() { id = 10000, name = username, username = username, password = password, roles = "admin" };//用户实体
string userdata = serializehelper.instance.jsonserialize<users>(modeluser);//序列化用户实体
//保存身份信息,参数说明可以看提示
formsauthenticationticket ticket = new formsauthenticationticket(1, username, datetime.now, datetime.now.addhours(12), false, userdata);
httpcookie cookie = new httpcookie(formsauthentication.formscookiename, formsauthentication.encrypt(ticket));//加密身份信息,保存至cookie
response.cookies.add(cookie);
现在身份信息就保存到cookie中了,如果有场景需要用到当前用户的用户id或者别的信息的时候该怎么办呢?
那么,我们重新在cookie中获取身份信息,然后解密,再反序列化成用户实体就ok了。
复制代码 代码如下:
/// <summary>
/// 获取用户登录信息
/// </summary>
/// <returns></returns>
public users getuser()
{
if (httpcontext.current.request.isauthenticated)//是否通过身份验证
{
httpcookie authcookie = httpcontext.current.request.cookies[formsauthentication.formscookiename];//获取cookie
formsauthenticationticket ticket = formsauthentication.decrypt(authcookie.value);//解密
return serializehelper.instance.jsondeserialize<users>(ticket.userdata);//反序列化
}
return null;
}
2、权限验证
这里用到的是mvc中的action拦截器(重写onactionexecuting),在action执行之前会先运行拦截器中的代码。这里同时可以身份验证是否过期。
复制代码 代码如下:
/// <summary>
/// 权限验证
/// </summary>
public class authattribute : actionfilterattribute
{
/// <summary>
/// 角色名称
/// </summary>
public string code { get; set; }
/// <summary>
/// 验证权限(action执行前会先执行这里)
/// </summary>
/// <param name="filtercontext"></param>
public override void onactionexecuting(actionexecutingcontext filtercontext)
{
//如果存在身份信息
if (!httpcontext.current.user.identity.isauthenticated)
{
contentresult content = new contentresult();
content.content = string.format("<script type='text/javascript'>alert('请先登录!');window.location.href='{0}';</script>", formsauthentication.loginurl);
filtercontext.result = content;
}
else
{
string[] role = checklogin.instance.getuser().roles.split(',');//获取所有角色
if (!role.contains(code))//验证权限
{
//验证不通过
contentresult content = new contentresult();
content.content = "<script type='text/javascript'>alert('权限验证不通过!');history.go(-1);</script>";
filtercontext.result = content;
}
}
}
}
那么在action中怎么去调用呢?这里贴出homecontroller中的代码来看下。
复制代码 代码如下:
public class homecontroller : basecontroller
{
[authattribute(code = "admin")]//验证通过(这个action只允许admin查看)
public actionresult index()
{
users modeluser = checklogin.instance.getuser();
return view(modeluser);
}
[authattribute(code = "user")]//验证不通过
public actionresult index2()
{
return view();
}
[authattribute(code = "admin")]//验证通过,发生异常
public actionresult index3()
{
return view();
}
}
这样就可以把权限控制到action了。
3、异常处理
上面homecontroller并不是继承controller,而是继承我们自己定义的一个basecontroller,那么我们来看看basecontroller中有写什么东西?
复制代码 代码如下:
[errorattribute]
public class basecontroller : controller
{
//所有controller都继承basecontroller,则都会进行异常捕获
}
在这里basecontroller只做了一件事情,就是增加了一个errorattribute的错误拦截器,那么只要是在controller中发生的异常都会在errorattribute中进行处理,你可以记录到数据库等操作。那么我们看看errorattribute是怎么工作的。
复制代码 代码如下:
/// <summary>
/// 错误日志(controller发生异常时会执行这里)
/// </summary>
public class errorattribute : actionfilterattribute, iexceptionfilter
{
/// <summary>
/// 异常
/// </summary>
/// <param name="filtercontext"></param>
public void onexception(exceptioncontext filtercontext)
{
//获取异常信息,入库保存
exception error = filtercontext.exception;
string message = error.message;//错误信息
string url = httpcontext.current.request.rawurl;//错误发生地址
filtercontext.exceptionhandled = true;
filtercontext.result = new redirectresult("/error/show/");//跳转至错误提示页面
}
}
在这里可以把异常捕获,然后跳转到友好的错误提示页面。在mvc中几个操作就可以这样简单的完成了,关于代码在文章下面会提供下载。
实例代码
作者:lying.net