.NET 6 支持Cookie与JWT混合认证、授权的方法

news2025/2/28 10:56:46

从.NET 5开始,.Net Core 与.NET Fremework 合并成了 .NET 5,所以标题也很让人尴尬,不知道该写成是.NET Core还是.NET X。因为这个方法支持.NET 5、6、7。

目录

  • 前言
  • Cookie 认证
  • JWT认证
  • 总结

前言

不知道大家有没有过这样的需求,为了方便快捷,网站电脑端与移动端API共用一个项目。这样可以节省大量的时间,减少代码的编写和维护量。而网站电脑端使用Cookie提供会员登录,移动端使用JWT提供会员登录。这时,这个网站项目就需要同时支持Cookie和JWT。本文使用的环境是.NET 6。

Cookie 认证

先添加Cookie认证。

var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration;
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication(options =>
{
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})//Cookie认证
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.Cookie.Name = "ApplicationCookie";
    options.Cookie.HttpOnly = true;
    //如果不指定,将会跳转到.NET 的默认登录页 account/login
    options.LoginPath = new PathString("/Home/Login");
});


var app = builder.Build();

代码中options.DefaultChallengeSchemeoptions.DefaultAuthenticateSchemeoptions.DefaultSignInSchemeoptions.DefaultSignOutScheme 使用的都是默认值。也可以自定义指定的值。

接下来添加认证和授权中间件。UseAuthenticationUseAuthorization需要注意的是,需要把他们放在路由和路由端点(路由终结点)之间。

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}"
        );

});

HomeController 上添加认证特性

 [Authorize]
 public class HomeController : Controller
 {
     public IActionResult Index()
     {
         return View();
     }
 }

这时,访问Home/Index,如果未认证,就进入我们指定的登录页,如果未指定登录页,进入默认的登录页account/login
构造一个简单的登录页

[Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        //登录页
        [AllowAnonymous]
        public IActionResult Login()
        {
            return View();
        }

    }

注意:这里的登录页加了AllowAnonymous特性,不然是访问不了的。启动程序后,自动跳转到Home/Login页。
在这里插入图片描述

点击立即登录,发起登录请求(ajax代码就不写了~)直接贴出登录方法:

[AllowAnonymous]
        [HttpPost]
        public async Task<IActionResult> UserLogin(string username,string password)
        {
            var claims = new List<Claim>()
                    {
                        new Claim("UserName", username)
                        
                    };
           
            var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
            ClaimsPrincipal principal = new ClaimsPrincipal(identity);
            await HttpContext.SignInAsync(
                CookieAuthenticationDefaults.AuthenticationScheme,
                principal,
                new AuthenticationProperties()
                {
                    IsPersistent = true,
                    ExpiresUtc = DateTimeOffset.UtcNow.AddDays(1),
                    AllowRefresh = true
                }
            );
            return Ok();
        }

先创建一个List<Claim>claims,然后将claims添加到认证方法中。然后在上下文中进行处理,最后进行存储。这里不细讲了。有兴趣的同学可以去了解一下细节。代码将登录过期时间设置成了1天。并且自动刷新登录凭据。也就是AllowRefresh = true ,这个自动刷新登录凭据是用户在登录后超过50%的ExpiresUtc 又一次登录,就自动延长登录时间。假设ExpiresUtc属性设置60分钟后,那么当用户登录后在大于30分钟且小于60分钟内访问了站点,那么就将用户登录状态再延长到当前时间后的60分钟。但是用户在登录后的30分钟内访问站点是不会延长登录时间的。
当登录后,返回首页,显示登录成功了
在这里插入图片描述
获取当前用户的方式是:

User.Claims.Where(c=>c.Type=="UserName").FirstOrDefault().Value

上面已经实现了Cookie认证的全部过程。接下来,在继续集成JWT认证

JWT认证

要使用JWT认证,该如何处理呢?首先安装JWT依赖:

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer

然后添加JWT服务。

//JWT认证
.AddJwtBearer(options =>
{
    options.RequireHttpsMetadata = false;
    options.SaveToken = false;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ClockSkew = TimeSpan.Zero, //到时间立即过期
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("xxxxxxxxxxxx")), //key
        ValidateIssuer = false,
        ValidateAudience = false
    };
});

这里的.AddJwtBearer写到.AddCookie({…})后面的。
创建一个控制器:APIController,然后在APIController控制器上添加认证特性。

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public class APIController : Controller
    {
        //....
    }

需要注意的地方:认证方案指定 为JwtBearerDefaults.AuthenticationScheme。MVC控制器无需指定方案名称,因为默认就是CookieAuthenticationDefaults.AuthenticationScheme。这样程序才能分清楚到底使用什么认证。

写一个登录方法,使用JWT方式。

[HttpPost]
[AllowAnonymous]
public async Task<string> SubmitLogin(string username, string password)
{
var UserId = await GetUserId(username,password);//这里仅做演示。方法需要自行实现
var claims = new List<Claim>()
            {
                new Claim("UserId",UserId)
            };
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("xxxxxxxxx"));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddHours(60 * 30);
var jwtToken = new JwtSecurityToken(
	string.Empty,
    string.Empty,
    claims,
    expires: expires,
    signingCredentials: credentials
);
var token = new JwtSecurityTokenHandler().WriteToken(jwtToken);
return token;
}

前端就可以通过登录方法获取token。在使用token去获取数据就可以了。

[HttpGet]
public string Test()
{
	 return "get vaue";
}

不用去理会如何进行认证的。后续将token置于请求头中即可验证通过。默认请求头:

Authorization:'Bearer {token}'

总结

暂无,下次再会!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于matlab的异步(感应)电机直接转矩控制系统

目 录 摘要 I 第1章 绪论 1 1.1 课题研究背景 1 1.2直接转矩控制技术的发展现状 1 1.2.1直接转矩控制的现状及发展趋势 1 1.2.2目前的热点研究问题及解决方法 2 1.3本文研究的主要内容 3 第2章 直接转矩控制系统理论 4 2.1概述 4 2.2 异步电动机的数学模型 4 2.3 逆变器的数学模…

【机器学习项目实战10例】(三):基于K近邻的葡萄酒质量检测项目

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、基于K近邻的葡萄酒质量检测项目二、数据集介绍三、导包四、读取数据五、绘制空间分布六、划分训练集、测试集七、构建K近邻模型八、绘制聚类效果九、网格搜索一、基于K近邻的葡萄酒质量检测项目 葡萄酒数据集是一个经典…

[附源码]SSM计算机毕业设计实验教学过程管理平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Ajax复习(62nd)

1、 Ajax 基础 1.1 传统网站中存在的问题 1、网速慢的情况下&#xff0c;页面加载时间长&#xff0c;用户只能等待 2、表单提交后&#xff0c;如果一项内容不合格&#xff0c;需要重新填写所有表单内容 3、页面跳转&#xff0c;重新加载页面&#xff0c;造成资源浪费&#xf…

基于matlab的BOC调制信号捕获仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 随着全球导航卫星系统的高速发展,导航系统的数量也越来越多,比如使用最广泛的GPS导航系统,以及越来越备受关注的中国北斗导航系统等.因此导航频段变得越来越拥挤,且各个频段内的信号相互…

activiti-api-impl

activiti-api-impl目录概述需求&#xff1a;设计思路实现思路分析1.CommonModelAutoConfiguration2.RuntimeEventImpl3.ProcessModelAutoConfiguration4.DefaultServiceTaskBehavior5.APIVariableInstanceConverterTaskModelAutoConfiguration参考资料和推荐阅读Survive by day…

Flutter高仿微信-第53篇-群聊-删除并退出

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; //删除并退出对话框 void _deleteAndExistDialog(){Load…

图解LeetCode——1752. 检查数组是否经排序和轮转得到(难度:简单)

一、题目 给你一个数组 nums 。nums 的源数组中&#xff0c;所有元素与 nums 相同&#xff0c;但按非递减顺序排列。 如果 nums 能够由源数组轮转若干位置&#xff08;包括 0 个位置&#xff09;得到&#xff0c;则返回 true &#xff1b;否则&#xff0c;返回 false 。 源数…

一文了解Linux上TCP的几个内核参数调优

Linux作为一个强大的操作系统&#xff0c;提供了一系列内核参数供我们进行调优。光TCP的调优参数就有50多个。在和线上问题斗智斗勇的过程中&#xff0c;笔者积累了一些在内网环境应该进行调优的参数。在此分享出来&#xff0c;希望对大家有所帮助。 调优清单 好了&#xff0…

Java#27(Arrays)

目录 一.Arrays 操作数组的工具类 二.Lambda表达式 1.注意: 2.省略规则 一.Arrays 操作数组的工具类 方法名 作用 public static String toString(数组) 把数组拼接…

大数据毕设选题 - 深度学习动物识别与检测系统( python opencv)

文章目录0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层4 数据集准备4.1 数据标注简介4.2 数据保存5 …

kafka集群搭建与prometheus监控配置

文章目录1、基于zookeeper的集群2、kafka集群安装2.1 基于Zookeeper集群的配置2.2 基于KRaft模式集群的配置2.3、启动Kafka集群3、kafka_exporter监控组件安装3.1、安装3.2、系统服务3.3、集成到prometheus4、与Grafana集成1、基于zookeeper的集群 下载地址&#xff1a;https:…

ABAP学习笔记之——第三章:OPEN SQL和NATIVE SQL

一、SAP R/3体系结构 SAP R/3一个分为三层&#xff1a;数据库层、应用层、表示层。其中应用层和数据库层由一个系统构成。 表示层&#xff1a;表示层(Presentation Layer)简单来讲其实就是指个人PC&#xff0c;是保存构成SAPGUI(GraphicalUserInterface)的软件组件(Software Co…

数字验证学习笔记——SystemVerilog芯片验证10 ——类的成员

一、类和成员 类是成员变量和成员方法的载体&#xff0c;之所以称为自洽体&#xff0c;是因为其变量和方法应符合‘聚拢’原则&#xff0c;即一个类的功能应该尽可能简单&#xff0c;不应承担过多的职责&#xff0c;更不应该承担不符合它的职责&#xff0c;这在设计模式被称为…

变分自编码器(VAES)

Dimensionality reduction ,PCA and autoencoders Dimensionality reduction 我们清楚&#xff0c;数据降维其实都是减少数据的特征数量&#xff0c;如果把encoderencoderencoder看作是由高维原有特征生成低维新特征的过程。把decoderdecoderdecoder看作是将低维特征还原为高…

vulnhub靶机ha:wordy

靶机下载链接&#xff1a;HA: Wordy ~ VulnHub 靶机ip&#xff1a;192.168.174.136&#xff08;后面重启后变成192.168.174.137&#xff09; kali ip&#xff1a;192.168.174.128 目录 靶机ip发现: 靶机端口扫描: 子目录扫描&#xff1a; wpscan扫描 漏洞利用1 漏洞利…

ASEMI肖特基二极管MBR40200PT参数,MBR40200PT规格

编辑-Z ASEMI肖特基二极管MBR40200PT参数&#xff1a; 型号&#xff1a;MBR40200PT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#xff0…

5、Mybatis的查询功能(必定有返回值)

Mybatis的查询功能&#xff08;必定有返回值&#xff09; 注意&#xff1a; 查询功能与前面的增删改不同&#xff0c;增删改的返回值是固定的&#xff08;所以增删改我们就有两种返回值要么设置为int获取受影响的行数&#xff0c;要么设置为void我们不获取返回值&#xff09;…

基于JAVA的农产品生鲜销售管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86468222 主要使用技术 Struts2HibernateJSPJSCSSMysql 功能介绍 1&#xff0c;游客访问 |–系统首页&#xff0c;查看商品列表 |–特价商品 |–最新上架 2&#xff0c;会员访问 |–用户登…

Qt 界面设置无边框之后如何实现缩放界面

在qt中&#xff0c;如果设置的了窗口无边框的话&#xff08;即setWindowFlag(Qt::FramelessWindowHint);&#xff09;那么窗口就没法直接被鼠标拖动了&#xff0c;也没法按住窗口的边界进行缩放。 如果要实现缩放和拖动&#xff0c;一般来说就需要的重写窗口类的mousePressEve…