一起养成写作习惯!这是我参与「掘金日新计划 · 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.cs
using Microsoft.AspNetCore.Authorization;
namespace 练习Demo.Unity
{
public class InfoRequirment:IAuthorizationRequirement
{
}
}
//HandleRequirement.cs
using 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
{
}
}
总结:还是那句话,一步步来,加油!