1 先访问 AuthorizetionServer :独立的鉴权中心站点 进行授权 取得 token(令牌);
2.用拿到的 token 再去调用 api
3.api 会先验证 token 是否正确并判断是否有效 如果验签通过 让其调用 api
所以我们实现这个功能最少需要两个独立的站点
一个是鉴权中心 负责对用户传过来的用户名 帐号 密码进行验证如果通过 颁发 token(令牌)
一个或多个是 api 站点通过调,用户调用 api 时 对传过来的 token 进行 验证如果验证通过就让期调用 api,如果不过 返回未授权
如何知道 Token 是来自于鉴权中心
1.Des 对称可逆加密 双方 用对称可逆加算法 加密约定好的密钥字符串进行加密解密,秘钥字符串 存在各自的配置文件中,签权中心用这组加密钥 进行加密 api 用这组密钥进行解密 优点是 效率高 缺点是 不安全 都用一组串 容易被人获取;
Rsa 非对称可逆加密 用非堆成可逆加密 鉴权中心存的是公钥 各个 api 存的是私钥 鉴权中心用公钥加密 api 用私钥解密 优点是 安全度高 用的不同的 秘钥 缺点是 效率会低一些 (建议用这个)
创建鉴权中心 webapi 站点
鉴权中心微服务站点功能很单一我这里用.NET6 新的 minimal APis
第一步创建 ICustomJWTService 接口
因为我们要实现两种方式的授权 我们先定义一个接口 让两个类都继承 这个接口 实现 依赖倒置原则
创建 ICustomJWTService 接口
/// <summary>
/// 定义一个接口用来处理 生成Token
/// </summary>
public interface ICustomJWTService
{
string GetToken(string UserName, string NickName, int Sex, string Role);
}
复制代码
第二步 新建 CustomDesJWTService 对称加密生成 Token 类 实现 ICustomJWTService 接口
public string GetToken(string UserName,string NickName,int Sex,string Role)
{
#region 第一步装配有效载荷的数据
//第一步 装配 有效载荷数据 尽量避免敏感信息 这里是传给鉴权端鉴权时使用的
var claims = new[]
{
new Claim(ClaimTypes.Name, UserName),
new Claim("NickName",NickName),//要传递给鉴权端的比如说昵称信息
new Claim("Role",Role),//要传递给鉴权端端的信息
new Claim("Sex",Sex.ToString()),//要传递给鉴权端的信息
};
#endregion
#region 第二步 生成 JwtSecurityToken 类
//第二步 生成Token
//1.传入加密秘钥
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtTokenOption.SecurityKey));
//2.选择加密方式 HS256
//HS256(带有 SHA - 256 的 HMAC 是一种对称算法, 双方之间仅共享一个 密钥。由于使用相同的密钥生成签名和验证签名, 因此必须注意确保密钥不被泄密。
SigningCredentials creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//3 通过构造函数方式 生成Token
JwtSecurityToken token = new JwtSecurityToken(issuer: JwtTokenOption.Issuer,
audience:JwtTokenOption.Audience,
claims:claims,
expires:DateTime.Now.AddMinutes(5),
signingCredentials: creds
);
#endregion
#region 第三步 将生成的 JwtSecurityToken类对象 传入 JwtSecurityTokenHandler.WriteToken()函数中生成Token字符串
//装配 JwtSecurityToken 类这后调用 JwtSecurityTokenHandler.WriteToken 生成Token 字符串
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
#endregion
return returnToken;
}
复制代码
第三步 Program.cs 中编写 收取 API
//容器注册对称授权类
builder.Services.AddTransient<ICustomJWTService, CustomDesJWTService>();
复制代码
//允许跨域
app.UseCors("AllowCors");
app.MapPost("/Authentication", (ICustomJWTService _iJWTService, string Name,string password) =>
{
if ("xxx".Equals(Name) && "123456".Equals(password))//这里应该查数据库取得用户信息
{
int Sex = 1;
string Role = "管理员"; 这里都是应该读数据库取得这里写死为了方便
string token = _iJWTService.GetToken(Name, password, Sex, Role);//这里会调生成一个token
return JsonConvert.SerializeObject(new
{
result = true,
token
});
}
else
{
return JsonConvert.SerializeObject(new
{
result = false,
token = ""
});
}
});
复制代码
测试接口 api 会返回一段 taken 字符串
将接 taken 字符串拿到 https://jwt.io/ 管网去解析
如图如果能解析出来就表示是对的
代码地址:https://gitee.com/xu-xiaoxiangJuZhen/authorization-center.git
评论