Asp.net core 2.2 Cookie验证 自定义授权 过滤器(注入方法)
一、注册服务。
services.AddAuthentication(option => { option.DefaultScheme = "Cookie"; option.DefaultChallengeScheme = "Cookie"; option.DefaultAuthenticateScheme = "Cookie"; option.DefaultForbidScheme = "Cookie"; option.DefaultSignInScheme = "Cookie"; option.DefaultSignOutScheme = "Cookie"; }).AddCookie("Cookie",option=> { option.LoginPath = "/login"; option.AccessDeniedPath = "/forbidden"; });
二、登录
注意:需要using Microsoft.AspNetCore.Authentication; 才能使用 HttpContext.SignInAsync
var claims = new List<Claim> { new Claim("user","admin"), new Claim("role","1,2,3,4,5"), new Claim("id","1") }; await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies")));
//注意:await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "role")));
//用这个里面的参数,user必须和上面的 new claim user一样,这样 User.Identity.Name才能获取到值,不然是空的
三、检查
这里就可以使用User
1、User.Identity.IsAuthenticated 是否登录
2、User.Identity.Name 用户名
3、User.Claims 其它登录时参数或其它,就可以从这里读取
---------其它-----
var claim = new Claim("name", "wallee");//我的众多信息中的一个信息单元,还有年龄、性别、家庭等等 var identity = new ClaimsIdentity("身份证");//我的众多身份证件中的一个,还有驾驶证、准考证、会计证、计算机二级证等等 identity.AddClaim(claim);//将上面那个信息片段添加到我的身份证里面 var principal=new ClaimsPrincipal(identity);//将身份证作为我这个人的初始化参数,初始化一个ClaimsPrincipal就代表了一个主体。 HttpContext.SignInAsync(principal);//最后,利用这个主体,调用HttpContext的扩展方法进行登陆。
上面只是完成了,登录及获取登录后的信息,下面授权,我没用系统的那一套东西,因为我需要的是对于权限这块,希望更灵活一些。我对这个理解的也不深。所以就自定义过滤器,来实现。
一、新建类:AppAuthorizeAttribute
///
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.RazorPages; // public class AppAuthorizeAttribute : ResultFilterAttribute { public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) {
//这里面就可以做很多事情了, var result = (PageResult)context.Result; if (context.HttpContext.User.Identity.IsAuthenticated) { await next.Invoke(); } else { context.HttpContext.Response.StatusCode = 404; } } }
二、调用:
[AppAuthorize]//就是这个 public class adminModel : PageModel { public void OnGet() { } }
//还可以 扩展:PageModel,来实现哦。
在实际应用中,经常会把登录的用户信息封装起来,方便后面使用,无论过滤器还是扩展PageModel
一、用户类:CurUser
public class CurUser { private readonly IHttpContextAccessor _httpContextAccessor; public CurUser(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public bool IsLogin { get { return _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated; } } }
在AppAuthorizeAttribute 过滤器,我可以这么使用。
public class AppAuthorizeAttribute : ResultFilterAttribute {
//这块就是注入了, public CurUser curUser { get; set; } public AppAuthorizeAttribute(CurUser _curuser) { curUser = _curuser; } public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { var login=curUser.IsLogin; var result = (PageResult)context.Result; if (context.HttpContext.User.Identity.IsAuthenticated) { context.HttpContext.Response.Headers.Add("islogin", curUser.IsLogin.ToString()); await next.Invoke(); } else { context.HttpContext.Response.StatusCode = 404; } } }
前台页面调用,就得需要修改一下了,
[ServiceFilter(typeof(AppAuthorizeAttribute))]//这里修改成这样,不然原先的[AppAuthorizeAttribute]这样写是会报错的, public class adminModel : PageModel { public void OnGet() { } }
这还没有结束
还得到Startup.cs 这里注册一下才可以使用。
services.AddScoped<AppAuthorizeAttribute>();
services.AddScoped<CurUser>();