.netcore的AOP讲解

138 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

前言

今天我们继续讲解.netcore的内容,解释都在代码注释里,一起看看吧!

角色授权

Authorize配置

角色授权配置

代码:

​
//UserloginAutenController.cs
​
  [Authorize(AuthenticationSchemes=CookieAuthenticationDefaults.AuthenticationScheme,Roles ="Admin")]
​
​
//program.cs
//授权配置
builder.Services.AddAuthentication(option =>
{
    option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,option =>
{
    option.LoginPath = "/userloginAuten/login";   //如果没有获取到用户信息,鉴权失败,授权自然也失败,跳转到指定的Action
    option.AccessDeniedPath = "/Home/index";  //如果没有授权角色,跳转
});

角色授权多组合

标记多个Authorize

标记一个Authorize

代码:

//UserloginAutenController.cs
[Authorize(AuthenticationSchemes=CookieAuthenticationDefaults.AuthenticationScheme,Roles ="Admin,User")]
​
​
//Roles ="Admin,User")相当于||

策略授权

之前所谓的角色授权其实就是一个特殊的策略授权

定义策略

策略生效

代码:

​
//program.cs
builder.Services.AddAuthorization(options => {
    options.AddPolicy("rolepolicy", c =>
    {
        c.RequireAssertion(context =>
        {
            return context.User.HasClaim(c => c.Type == ClaimTypes.Role) && context.User.Claims.First(c => c.Type.Equals(ClaimTypes.Role)).Value == "Admin";
​
        });
    });
});
​
​
//UserloginAutenController.cs
[Authorize(AuthenticationSchemes=CookieAuthenticationDefaults.AuthenticationScheme,Policy="rolepolicy")]

策略授权Requirement扩展

之前做的授权全部都是固定在代码中

如果想要请求来了以后,希望通过用户信息,连接数据验证---业务上的验证

代码:

//service层
​
​
//UserService.cs
namespace Service
{
    public class UserService : IUserService
    {
        public bool Validata(string username, string password)
        {   
            //这里连接数据库去校验
            return true;  
        }
    }
}
​
​
​
//IUserService.cs
namespace Service
{
    public interface IUserService
    {
        bool Validata(string username, string password);
    }
}
​
​
//program.cs
​
builder.Services.AddAuthorization(options => {
    options.AddPolicy("rolepolicy", policy =>
    {
        policy.RequireAssertion(context =>
        {
​
          
            return context.User.HasClaim(c => c.Type == ClaimTypes.Role) && context.User.Claims.First(c => c.Type.Equals(ClaimTypes.Role)).Value == "Admin";
​
        });
​
        policy.AddRequirements(new InfoRequirment());  //映射到Handler那里,调用HandleRequirementAsync方法,其中有context,传输给userservice
    });
   
});
builder.Services.AddTransient<IAuthorizationHandler, HandleRequirement>();
​
​
​
//InfoRequirment.csusing Microsoft.AspNetCore.Authorization;
​
namespace 练习Demo.Unity
{
    public class InfoRequirment:IAuthorizationRequirement
    {
    }
}
​
​
//HandleRequirement.csusing Microsoft.AspNetCore.Authorization;
using Service;
​
namespace 练习Demo.Unity
{
    public class HandleRequirement : AuthorizationHandler<InfoRequirment>
    {
        private IUserService _userService;
​
        public HandleRequirement(IUserService userService)
        {
            this._userService = userService;
        }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, InfoRequirment requirement)
        {
            //这里做验证
            string username = context.User.Claims.First(c => c.Type == "UserName").Value;
            string password = context.User.Claims.First(c => c.Type == "PassWord").Value;
            
​
            if (_userService.Validata(username, password))
            {
                context.Succeed(requirement);
            }
​
​
            return Task.CompletedTask;
        }
    }
}
​

Filter生命周期

)现在ASP.NET Core中的几个Filter来支持的AOP已经讲解完成那么这个几个Filter的生命周期是怎样的呢?

分别把6个Filter全部注册到某一个方法,来看看执行顺序

多个相同的Filter不同注册效果

分别定义三个Filter

分别全局注册、控制器注册、Action注册

看看结果

41、ASP.NET Core6 IOC容器

什么是IOC容器

内置容器ServiceCollection的应用

//Services
//program.cs
{
​
​
    //传统工艺
    IMicrosoft microsoft = new Microsoft1();
​
}
​
​
//内置容器
{ 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient<IMicrosoft, Microsoft1>();
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IMicrosoft microsoft1= serviceProvider.GetService<IMicrosoft>();    
}
​
​
//类库
using Interfaces;
​
namespace Serevices
{
    public class Microsoft1: IMicrosoft
    {
        public Microsoft1()
        {
            Console.WriteLine($"{this.GetType().Name}被构造了。。");
        }
    }
}
​
​
//接口类库
namespace Interfaces
{
    public interface IMicrosoft
    {
       
    }
}

总结:还是那句话,一步步来,加油!