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>();

 

posted @ 2019-08-16 15:00  jiachunhui  阅读(557)  评论(0编辑  收藏  举报