第一步:在Nuget上安装"Microsoft.AspNet.WebApi.Cors"包,并对api controller使用[EnableCors]特性以及Microsoft.AspNetCore.Authentication.JwtBearer包

第二步:创建.netcore API项目 /控制器:AuthenticateController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using static JSON_WEB_Token.Helper; namespace JSON_WEB_Token.Controllers
{ //跨域标签
[EnableCors("anyPolicy")]
//API接口打上Authorize标签
[Authorize]
[ApiController]
//路由配置
[Route("api/[controller]/[action]")]
public class AuthenticateController : ControllerBase
{
private JwtSettingsModel _jwtSettings;
public AuthenticateController(IOptions<JwtSettingsModel> jwtSetting)
{
_jwtSettings = jwtSetting.Value;
} [HttpPost]
public IActionResult Token([FromBody]PasswordModel request)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecetKey)); string userId = request.UserName == null ? request.UserName : request.UserNo;
if (request.UserName != "test" && request.PassWord != "" )
{
return BadRequest();
} var tokenModel = Helper.GetAccessTokenModel
(new UserData()
{
UserGid = strUserGid,
UserNo = "test"
},
*
); return Ok(tokenModel);
} } public class PasswordModel
{
public string UserName { get; set; }
public string PassWord { get; set; }
public string UserNo { get; set; }
public string ClientSecret { get; set; } }
}
 

第三步: Helper

using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks; namespace JSON_WEB_Token
{
public class Helper
{
public static AccessTokenResponse GetAccessTokenModel(UserData userData, int hours = , DateTime? expireTimeSpan = null)
{
JwtSettingsModel _jwtSettings = GetAppsettings<JwtSettingsModel>("JwtSettings");
//创建claim
var claim = new Claim[]{
new Claim(ClaimTypes.Sid,userData.UserGid.ToString()),
new Claim(ClaimTypes.Name,userData.UserNo),
new Claim(ClaimTypes.Role,TokenRoleType.UserApp), };
//对称秘钥 签名秘钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecetKey));
//签名证书(秘钥,加密算法)
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//生成token
DateTime expiresDate = expireTimeSpan ?? System.DateTime.Now.AddHours(hours); var token = new JwtSecurityToken(_jwtSettings.Issuer, _jwtSettings.Audience, claim, DateTime.Now, expiresDate, creds); //保存token
var accessTokenModel = new AccessTokenResponse();
accessTokenModel.TokenType = "Bearer";
accessTokenModel.UserNo = userData.UserNo;
accessTokenModel.ExpiresDate = DateTimeToTimestamp(expiresDate);
accessTokenModel.AccessToken = new JwtSecurityTokenHandler().WriteToken(token);
return accessTokenModel; } public static long DateTimeToTimestamp(DateTime dateTime)
{
var start = new DateTime(, , , , , , dateTime.Kind);
return Convert.ToInt64((dateTime - start).TotalSeconds);
}
public class UserData
{
public Guid UserGid { get; set; }
public string UserNo { get; set; }
[Required]
public string UserName { get; set; }
public string PassWord { get; set; } } public class AccessTokenResponse
{
public string TokenType { get; set; } = "Bearer";
public string UserNo { get; set; }
public string AccessToken { get; set; }
public long ExpiresDate { get; set; } }
/// <summary>
/// 获取配置文件信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="setKey"></param>
/// <returns></returns>
public static T GetAppsettings<T>(string setKey)
{ var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json").Build();
return builder.GetSection(setKey).Get<T>();
} /// <summary>
/// Token用户类型
/// </summary>
public class TokenRoleType
{
/// <summary>
/// 匿名Token
/// </summary>
public const string GuoWaiApp = "国外渠道"; /// <summary>
/// 用户Token
/// </summary>
public const string UserApp = "国内渠道"; } } }

第四:JwtSettingsModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace JSON_WEB_Token
{
public class JwtSettingsModel
{
//token是谁颁发的
public string Issuer { get; set; }
//token可以给哪些客户端使用
public string Audience { get; set; }
//加密的key 必须是16个字符以上,要大于128个字节
public string SecetKey { get; set; }
} public class AccessTokenErrModel
{
public string AppId { get; set; } public string errcode { get; set; }
public string errmsg { get; set; } public Guid UserGid { get; set; } }
}

第五:appsettings

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}, "AllowedHosts": "*", "JwtSettings": {
"Issuer": "http://localhost:44305",
"Audience": "http://localhost:44305",
"SecetKey": "HelloWorldHelloWorldHelloWorld"
}
}

第六:Startup

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens; namespace JSON_WEB_Token
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); #region json web token 添加认证服务
//将appsettings.json中的JwtSettings部分文件读取到JwtSettings中
services.Configure<JwtSettingsModel>(Configuration.GetSection("JwtSettings")); //使用Bind的方式读取配置
//将配置绑定到JwtSettings实例中
var jwtSettings = new JwtSettingsModel();
Configuration.Bind("JwtSettings", jwtSettings); services.AddAuthentication(options => {
//认证middleware配置
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
//options.SaveToken = true;
//options.RequireHttpsMetadata = false;
//主要是jwt token参数设置
options.TokenValidationParameters = new TokenValidationParameters
{ //Token颁发机构
ValidIssuer = jwtSettings.Issuer,
//颁发给谁
ValidAudience = jwtSettings.Audience,
//这里的key要进行加密
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecetKey)) };
});
#endregion #region 注册跨域请求服务 CORS 中间件处理跨域请求
//注册跨域请求服务 允许所有来源、所有方法、所有请求标头、允许请求凭据
services.AddCors(options =>
{
//注册默认策略
options.AddDefaultPolicy( builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
// .AllowCredentials()
;
});
//注册一个策略名称
options.AddPolicy("anyPolicy", builder =>
{
builder.WithOrigins("http://127.0.0.1:9102", "https://www.baidu.com")
.AllowAnyMethod()
.AllowAnyHeader()
// .AllowCredentials()
;
});
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
#endregion
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseHttpsRedirection();
/////////////////////////////////////////////
//授权(Authorization)
app.UseAuthorization();
///添加中间件(Middleware) 启用验证
app.UseAuthentication();
/////////////////////////////////////////////////
app.UseCors("anyPolicy"); // 设置全局跨域
app.UseRouting(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Authenticate}/{action=Index}/{id?}");
});
}
}
}

第七:postman请求

.Net Core 3.0 Api json web token 中间件签权验证和 Cors 中间件处理跨域请求的更多相关文章

  1. Handle Refresh Token Using ASP.NET Core 2.0 And JSON Web Token

    来源:   https://www.c-sharpcorner.com/article/handle-refresh-token-using-asp-net-core-2-0-and-json-web ...

  2. JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案

    一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. ...

  3. JWT(JSON Web Token) 【转载】

    JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...

  4. JSON Web Token(JWT)原理和用法介绍

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.今天给大家介绍一下JWT的原理和用法. 官网地址:https://jwt.io/ 一.跨域身份验证 Internet服务无法与 ...

  5. JSON Web Token (JWT) 实现与使用方法

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  6. 一分钟简单了解 JSON Web Token

    JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证 ...

  7. ASP.NET Core 启用跨域请求

    本文翻译整理自:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1 一 .Cross-Orig ...

  8. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  9. [转] JSON Web Token in ASP.NET Web API 2 using Owin

    本文转自:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/ ...

随机推荐

  1. 使用Matplotlab画图

    1.绘制折线图 #! /usr/bin/env python#encoding=utf-8 # 用于python2import sys reload(sys) sys.setdefaultencodi ...

  2. 浏览器从输入URL到渲染完页面的整个过程

    从输入URL到渲染出整个页面的过程包括三个部分: 1.DNS解析URL的过程 2.浏览器发送请求与服务器交互的过程 3.浏览器对接收到的html页面渲染的过程 一.DNS解析URL的过程 DNS解析的 ...

  3. async和await执行顺序

    关于执行顺序和线程ID,写了一个小程序来检测学习: using System; using System.Net; using System.Threading; using System.Threa ...

  4. 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)

    题目链接 传送门 思路 首先我们对\(a\)正反各跑一边\(LIS\),记录每个位置在前一半的\(LIS\)中应该放的位置\(ans1[i]\),后一半的位置\(ans2[i]\). 对于字典序最小的 ...

  5. httprunner学习9-完整的用例结构(yaml&json)

    前言 前面几篇零散的学了一些httprunner的知识点,那么一个完整的 YAML/JSON 用例文件包含哪些关键字呢? 测试用例结构 在 HttpRunner 中,测试用例组织主要基于三个概念: 测 ...

  6. python中requests库get方法带参数请求

    起因是想爬五等分的花嫁的漫画.这是其中的一个坑 先上代码 data={ 'cid':567464, , 'key':'', 'language':1, 'gtk':6, '_cid':567464, ...

  7. P1850 换教室[dp+期望]

    流下了不会概率的眼泪,由于不会概率,转移少写了点东西... 这个dp很简单,就是一个普通的线性dp加点期望.(刚开始写这道题时信笔写下) \(dp[0/1][i][j]\)表示到第\(i\)个时间段时 ...

  8. 金生芳-实验十四 团队项目评审&课程学习总结

    实验十四 团队项目评审&课程学习总结 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课 ...

  9. 20180523模拟赛T2——前缀!

    简化版题面 jyt毒瘤,写了超长的题面,要看完整题面的翻到最后-- 定义\(f_0(x) = A_x\),\(f_n(x) = \sum^x_{i = 1} f_{n-1}(i)\).给出长度为\(N ...

  10. java 如何用pattern 和 Matcher 来使用正则表达式(一)

    近期用到了java或者scala的正则表达式的用法,抽点时间总结一下: 转自:https://www.cnblogs.com/haodawang/p/5967219.html java的regex库 ...