asp.net mvc的Filter来验证Forms 判断是否登录,角色权限以及错误处理(转)

简介: asp.net mvc里的Filter真的是个很好的东西.之前看教程每次看到讲解Filter的地方总有模糊.今天在做测试项目的时候.管理员后台管理的时候.我在每个Action里都先验证了一下是否登录.结果做了7,8个Action的时候发现这样是不是有点太累了?脑袋里马上灵光一闪.

asp.net mvc里的Filter真的是个很好的东西.之前看教程每次看到讲解Filter的地方总有模糊.今天在做测试项目的时候.管理员后台管理的时候.我在每个Action里都先验证了一下是否登录.结果做了7,8个Action的时候发现这样是不是有点太累了?脑袋里马上灵光一闪.Filter不是有个内置验证身份的吗? 
马上搜索,一翻查找之后才发现内置的这个身份验证是争对membership的.而我使用的Forms验证.. 
咋办..继续搜呗.功夫不负有心人..终于让我给找到了.经过测试,使用很不错. 
7,8个action里的if (!Request.IsAuthenticated)终于可以变成一句了..这样我就可以更安心的写Action了. 
不说了.贴代码. 
先是自定义的 Filter:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Web.Routing;

namespace cml.web.Filters
{
///
/// 角色认证
///
public class VaildateLoginRoleAttribute : ActionFilterAttribute
{
///
/// 角色名称
///
public string Role { get; set; }

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!string.IsNullOrEmpty(Role))
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string redirectOnSuccess = filterContext.HttpContext.Request.RawUrl;
string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
else
{
//判断是否存在角色
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
string roles = ticket.UserData;
string[] chkRoles = this.Role.Split(',');
bool isAuthorized = false;
if (Array.IndexOf(chkRoles, roles) > -1)
isAuthorized = true;
else
isAuthorized = false;

if (!isAuthorized)
filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller = "Manage", action = "AdminLogin" }));
//throw new UnauthorizedAccessException("你没有权限访问该页面");
}
}
else
{
throw new InvalidOperationException("没有指定角色");
}
}
}

//错误验证
//public class ErrorAttribute : ActionFilterAttribute
//{
// public override void OnActionExecuted(ActionExecutedContext filterContext) // OnActionExecuted表示在Action执行之后
// {
// if (filterContext.Exception != null)
// {
// filterContext.ExceptionHandled = true;
// filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller = "Shared", action = "Error" }));
// }
// }
//}
public class VaildateLogin : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller = "Manage", action = "AdminLogin" }));
}
}
}
}

FilterOK了..就去Controller里使用吧.

[VaildateLogin] //这里就是使用的Filter验证,记得在using里引用Filter的命名空间.
public ActionResult AddAdmin()
{
//if (!Request.IsAuthenticated) //这里是开始手动写的..多麻烦...
//{
// return RedirectToAction("AdminLogin");
//}
//else
//{
cml.BLL.Admin bll = new cml.BLL.Admin();
ViewData["list_model"] = bll.GetAdminList("", 1);
return View();
//}
}

怎么样.很方便吧.如果是整个Controller下都需要身份验证的话..那就把这个Filter放到最外层的Controller上..这样就不用在每个Action上都写了. 
完工..希望多点人来学习asp.net mvc..要不然教程太少了.好东西也太少了.

学习交流群:364976091
相关文章
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
639 1
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
648 2
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
983 0
|
开发框架 JSON .NET
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
299 0
|
开发框架 JavaScript .NET
Asp.Net就业课之三验证控件
Asp.Net就业课之三验证控件
278 0
|
开发框架 JSON 算法
ASP.NET Core Web API之Token验证
ASP.NET Core Web API之Token验证
709 0
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
1067 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
702 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
594 7