千家信息网

.NET CORE如何鉴权

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇内容主要讲解".NET CORE如何鉴权",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习".NET CORE如何鉴权"吧!基础信息1.什么是鉴权授权?鉴权
千家信息网最后更新 2026年11月04日.NET CORE如何鉴权

本篇内容主要讲解".NET CORE如何鉴权",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习".NET CORE如何鉴权"吧!

基础信息

1.什么是鉴权授权?

  • 鉴权是验证用户是否拥有访问系统的权利,授权是判断用户是否有权限做一些其他操作。

2.传统的Session 和Cookie

  • 主要用于无状态请求下的的用户身份识别,只不过Session将信息存储在服务端,Cookie将信息存储在客户端。

Session

  • 在客户端第一次进行访问时,服务端会生成一个Session id返回到客户端

  • 客户端将Session id存储在本地后续每一次请求都带上这个id

  • 服务端从接收到的请求中根据Session id在自己存储的信息中识别客户端

Cookie

  • 在客户端访问服务器时,服务端会在响应中颁发一个Cookie

  • 客户端会把cookie存储,当再访问服务端时会将cookie和请求一并提交

  • 服务端会检查cookie识别客户端,并也可以根据需要修改cookie的内容

3.存在的问题

在分布式或集群系统中使用Session

假设现在服务器为了更好的承载和容灾将系统做了分布式和集群,也就是有了N个服务端,那是不是每一个服务端都要具有对每一个客户端的Session或者Cookie的识别能力呢?

这个可以使用Session共享的方式用于Session的识别,但是这并不能解决分布式系统下依然存在这个问题,因为通常每一个分布式系统都由不同的人负责或者跨网络,甚至不同的公司,不可能全部都做session共享吧?这个时候就诞生了一个新的方式,使用Token

4.Token

  • Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。

执行步骤

  • 用户向统一的鉴权授权系统发起用户名和密码的校验

  • 校验通过后会颁发一个Token,用户就拿着颁发的Token去访问其他三方系统

  • 三方系统可以直接请求鉴权授权系统验证当前Token的合法性,也可以根据对称加密使用秘钥解密Token以验证合法性

.NET Core中鉴权

  • Authentication: 鉴定身份信息,例如用户有没有登录,用户基本信息

  • Authorization: 判定用户有没有权限

1.NET Core鉴权授权基本概念

在NETCORE中鉴权授权是通过AuthenticationHttpContextExtensions扩展类中的实现的HttpContext的扩展方法来完成的

 public static class AuthenticationHttpContextExtensions {   public static Task SignInAsync(this HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties)    {       context.RequestServices.GetRequiredService().SignInAsync(context, scheme, principal, properties);   }          }

它真正的核心在
Microsoft.AspNetCore.Authorization模块,整个流程处理主要包含如下几个关键类

  • IAuthenticationHandlerProvider

负责对用户凭证的验证,提供IAuthenticationHandler处理器给IAuthenticationService用于处理鉴权请求,当然可以自定义处理器

  • IAuthenticationSchemeProvider

选择标识使用的是哪种认证方式

  • IAuthenticationService

提供鉴权统一认证的5个核心业务接口

 public interface IAuthenticationService {   //查询鉴权   Task AuthenticateAsync(HttpContext context, string scheme);    //登录写入鉴权凭证   Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties);         //退出登录清理凭证   Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties);      Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties);      Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties); }

在它的实现类AuthenticationService中的SignInAsync方法
配合IAuthenticationHandlerProvider 和IAuthenticationSchemeProvider得到一个IAuthenticationHandler,最终将鉴权写入和读取都由它完成

public virtual async Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties){         if (scheme == null)    {        //IAuthenticationSchemeProvider实例        var defaultScheme = await Schemes.GetDefaultSignInSchemeAsync();        scheme = defaultScheme?.Name;    }  //IAuthenticationHandlerProvider实例获取处理器  var handler = await Handlers.GetHandlerAsync(context, scheme);  var signInHandler = handler as IAuthenticationSignInHandler;    //各自的处理器handler   //例如使用Cookie 就会注入一个CookieAuthenticationHandler  //使用JWT 就注入一个JwtBearerHandler  await signInHandler.SignInAsync(principal, properties);}

2.使用Cookie默认流程鉴权

  • 使用中间件加入管道,用于找到鉴权HttpContext.AuthenticateAsync()

   //核心源码就是AuthenticationMiddleware中间件   app.UseAuthentication();
  • 注入容器,将CookieAuthenticationHandler作为处理逻辑

services.AddAuthentication(options =>{     //CookieAuthenticationDefaults.AuthenticationScheme == "Cookies"     options.DefaultAuthenticateScheme = "Cookies";     options.DefaultSignInScheme = "Cookies";}).AddCookie();
  • 在登录时写入凭证

  • Claims:一项信息,例如工牌的姓名是一个Claims ,工牌号码也是一个Claims

  • ClaimsIdentity:一组Claims 组成的信息,就是一个用户身份信息

  • ClaimsPrincipal:一个用户有多个身份

  • AuthenticationTicket:用户票据,用于包裹ClaimsPrincipal

      [AllowAnonymous]  public async Task Login(string name, string password)  {      if(name!="Admin" && password!="000000")      {         var result = new JsonResult(new{ Result = false,Message = "登录失败"});         return result;      }     //Claims  ⫋ ClaimsIdentity ⫋ ClaimsPrincipal     var claimIdentity = new ClaimsIdentity("ClaimsIdentity");     claimIdentity.AddClaim(new Claim(ClaimTypes.Name, name));     claimIdentity.AddClaim(new Claim(ClaimTypes.Address, "地址信息"));          AuthenticationProperties ap = new AuthenticationProperties();     ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimIdentity);     await base.HttpContext.SignInAsync("Cookies",claimsPrincipal , ap)     return new JsonResult(new{ Result = false,Message = "登录成功"});  }

在其他控制器上标记[Authorize]特性,在访问接口框架会自动进行鉴权并将身份信息写入上下文

  • [AllowAnonymous]:匿名可访问

  • [Authorize]:必须登录才可访问

3.自定义IAuthenticationHandler

  • 实现IAuthenticationHandler, IAuthenticationSignInHandler, IAuthenticationSignOutHandler三个接口

public class CoreAuthorizationHandler : IAuthenticationHandler,IAuthenticationSignInHandler, IAuthenticationSignOutHandler{      public AuthenticationScheme Scheme { get; private set; }      protected HttpContext Context { get; private set; }      public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)      {          Scheme = scheme;          Context = context;          return Task.CompletedTask;      }           public async Task AuthenticateAsync()     {        var cookie = Context.Request.Cookies["CustomCookie"];        if (string.IsNullOrEmpty(cookie))        {            return AuthenticateResult.NoResult();        }        AuthenticateResult result = AuthenticateResult        .Success(Deserialize(cookie));        return  await Task.FromResult(result);    }         public Task ChallengeAsync(AuthenticationProperties properties)     {          return Task.CompletedTask;     }     public Task ForbidAsync(AuthenticationProperties properties)     {          Context.Response.StatusCode = 403;          return Task.CompletedTask;     }                 public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)        {            var ticket = new AuthenticationTicket(user, properties, Scheme.Name);            Context.Response.Cookies.Append("CoreAuthorizationHandlerCookies", Serialize(ticket));            return Task.CompletedTask;        }     public Task SignOutAsync(AuthenticationProperties properties)     {            Context.Response.Cookies.Delete("CoreAuthorizationHandlerCookies");            return Task.CompletedTask;     }             private AuthenticationTicket Deserialize(string content)     {         byte[] byteTicket = System.Text.Encoding.Default.GetBytes(content);         return TicketSerializer.Default.Deserialize(byteTicket);     }     private string Serialize(AuthenticationTicket ticket)     {        //需要引入  Microsoft.AspNetCore.Authentication        byte[] byteTicket = TicketSerializer.Default.Serialize(ticket);        return Encoding.Default.GetString(byteTicket);     }}
  • 在容器中注册自定义的Handler

services.AddAuthenticationCore(options =>{   options.AddScheme("AuthenticationScheme", "AuthenticationScheme");});

到此,相信大家对".NET CORE如何鉴权"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

用户 信息 服务 客户 客户端 系统 处理 登录 身份 存储 凭证 分布式 处理器 验证 内容 接口 方式 方法 核心 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳恒合互联网络科技有限公司 互联网科技有限公司经营范围 盈实互联网科技 猪兼强互联网科技 科技互联网创业计划书 互联网和高科技公司 互联网科技热点资讯 字节跳动和互联网科技 团飞科技与伯堂互联网服务平台 科技类公司包括互联网吗 爱医互联网络科技 国大互联网教育科技有限公司薪资 半导体是互联网高科技吗 图游互联网科技 广州有谷有贝互联网科技有限公司 扫呗互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 长沙易易互联网科技有限公司 互联网科技创业计划的风险分析 银川新华互联网科技学校招聘 有格互联网科技 互联网科技金融公司 凡科互联网科技 广州互联网络科技有限公司 新浪科技互联网 佰商互联网科技有限公司 创业天下互联网科技有限公司 互联网科技和信息 合肥互联网科技公司公章图片 恒生科技互联网指数十大成分股
0