ASP.NET Core MVC 过滤器介绍
https://www.cnblogs.com/tdfblog/p/filters-in-aspnet-core-mvc.html
asp.net core的执行顺序是,收到一个请求后,request请求会先经过已注册的中间件,然后会进入到mvc的拦截器管道
调整过滤器执行顺序
[MyFilter(Name = “Controller Level Attribute”, Order=1)]
Authorization Filters
Resopurces Filters
Model Binding
Action Filters
Excepition Filters
Result Filters
Result Exception
AP:10.134.167.89 G1700336 2wsx#EDC sHEr8SB5a719
services.AddControllersWithViews(options =>
{
options.Filters.Add< FilterController > ();
namespace CMVC
{
public class FilterController: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
//拦截全局里是否带了token
//if (string.IsNullOrEmpty(context.HttpContext.Request.Query["token"]))
//{
// context.Result = new JsonResult(
// //该类是KeeSoft框架里自带的一个返回结果集
// new KeeSoft.Core.ResponseMessage()
// {
// Status = KeeSoft.Core.ResponseStatus.ERROR.ToString(),
// Text = "token缺失"
// }
// );
//}
假设有这么类可以将token解析成用户基本信息
//KeeSoft.Mini.Utils.User user =
// new KeeSoft.Mini.Utils.User(context.HttpContext.Request.Query["token"]);
接着我们将这个user实例注册到控制器的方法里,之后你在控制器里命名带有user的参数,
将自动转成 KeeSoft.Mini.Utils.User类型的实例
//context.ActionArguments["user"] = user;
}
}
}
// IAuthorizationFilter 的一个实现
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
namespace Sample
{
public class AdminRequired : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
if(context.Filters.Any(it=>it is Microsoft.AspNetCore.Mvc.Authorization.IAllowAnonymousFilter))
{
}
else
{
string userName = context.HttpContext.Session.GetString("username");
if (string.IsNullOrEmpty(userName ))
{
RedirectResult result = new RedirectResult("~/Login");
context.Result = result;
}
else
{
}
}
}
}
}
这里使用了Session,需要先在Startup.cs中定义:
public void ConfigureServices(IServiceCollection services)中添加
services.AddSession();
public void Configure(IApplicationBuilder app, IHostingEnvironment env) 中添加
app.UseSession();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Authorization;
namespace MoMaMiBiao.Controllers
{
[TypeFilter(typeof(Sample.AdminRequired))] //声明Admin下面的方法如无例外都需要AdminRequired权限
public class AdminController : Controller
{
public IActionResult Index()
{
return View("~/wwwroot/Admin/Index.cshtml");
}
public IActionResult Welcome()
{
return View("~/wwwroot/Admin/Welcome.cshtml");
}
[TypeFilter(typeof(AllowAnonymousFilter))] //声明Login方法是完全开放,无需验证
public IActionResult Login()
{
return View("~/wwwroot/Admin/Login.cshtml");
}
}
}
public void OnAuthorization(AuthorizationContext filterContext)
{
string name = context.HttpContext.User.Identity.Name;
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
string actionName = filterContext.ActionDescriptor.ActionName;
if(controllerName==“Login”&&(actionName.ToUpper()==“index”.ToUpper() || actionName.ToUpper() == “login”.ToUpper()))
{
}
else
{
//检查登陆状态
if (filterContext.HttpContext.Session[“username”] == null)
{
ContentResult con = new ContentResult();
con.Content = “没有登陆”;
filterContext.Result = con;
}
}
}
.net core 基础认证
https://bigger.ee/archives/17.html
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(typeof(MyActionOneAttribute));
});
}
[MyActionThree]
public class HomeController : BaseController
{
[MyActionFour]
public IActionResult Index()
{
using (var writer = new StreamWriter(HttpContext.Response.Body))
{
writer.Write(“
}
return new EmptyResult();
}
}
public class MyActionOneAttribute : Attribute, IActionFilter