Jwt

.wiz-editor-body .wiz-code-container { position: relative; padding: 8px 0; margin: 5px 0; text-indent: 0; text-align: left }
.CodeMirror { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; color: rgba(0, 0, 0, 1); font-size: 0.875rem }
.wiz-editor-body .wiz-code-container .CodeMirror div { margin-top: 0; margin-bottom: 0 }
.CodeMirror-lines { padding: 4px 0 }
.CodeMirror pre.CodeMirror-line, .CodeMirror pre.CodeMirror-line-like { padding: 0 4px }
.CodeMirror pre.CodeMirror-line { min-height: 24px }
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: rgba(255, 255, 255, 1) }
.CodeMirror-gutters { border-right: 1px solid rgba(221, 221, 221, 1); background-color: rgba(247, 247, 247, 1); white-space: nowrap }
.CodeMirror-linenumbers { }
.CodeMirror-linenumber { padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: rgba(153, 153, 153, 1); white-space: nowrap }
.CodeMirror-guttermarker { color: rgba(0, 0, 0, 1) }
.CodeMirror-guttermarker-subtle { color: rgba(153, 153, 153, 1) }
.CodeMirror-cursor { border-left: 1px solid rgba(0, 0, 0, 1); border-right: none; width: 0 }
.CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid rgba(192, 192, 192, 1) }
.cm-fat-cursor .CodeMirror-cursor { width: auto; border: 0 !important; background: rgba(119, 238, 119, 1) }
.cm-fat-cursor div.CodeMirror-cursors { z-index: 1 }
.cm-fat-cursor-mark { background-color: rgba(20, 255, 20, 0.5); -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: 1.06s step-end infinite blink }
.cm-animate-fat-cursor { width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: 1.06s step-end infinite blink; background-color: rgba(119, 238, 119, 1) }
@-moz-keyframes blink { 0% {} 50% { background-color: transparent; } 100% {}}
@-webkit-keyframes blink { 0% {} 50% { background-color: transparent; } 100% {}}
@keyframes blink { 0% { } 50% { background-color: rgba(0, 0, 0, 0) } 100% { } }
.CodeMirror-overwrite .CodeMirror-cursor { }
.cm-tab { display: inline-block; text-decoration: inherit }
.CodeMirror-rulers { position: absolute; left: 0; right: 0; top: -50px; bottom: -20px; overflow: hidden }
.CodeMirror-ruler { border-left: 1px solid rgba(204, 204, 204, 1); top: 0; bottom: 0; position: absolute }
.cm-s-default .cm-header { color: rgba(0, 0, 255, 1) }
.cm-s-default .cm-quote { color: rgba(0, 153, 0, 1) }
.cm-negative { color: rgba(221, 68, 68, 1) }
.cm-positive { color: rgba(34, 153, 34, 1) }
.cm-header, .cm-strong { font-weight: bold }
.cm-em { font-style: italic }
.cm-link { text-decoration: underline }
.cm-strikethrough { text-decoration: line-through }
.cm-s-default .cm-keyword { color: rgba(119, 0, 136, 1) }
.cm-s-default .cm-atom { color: rgba(34, 17, 153, 1) }
.cm-s-default .cm-number { color: rgba(17, 102, 68, 1) }
.cm-s-default .cm-def { color: rgba(0, 0, 255, 1) }
.cm-s-default .cm-variable, .cm-s-default .cm-punctuation, .cm-s-default .cm-property, .cm-s-default .cm-operator { }
.cm-s-default .cm-variable-2 { color: rgba(0, 85, 170, 1) }
.cm-s-default .cm-variable-3 { color: rgba(0, 136, 85, 1) }
.cm-s-default .cm-comment { color: rgba(170, 85, 0, 1) }
.cm-s-default .cm-string { color: rgba(170, 17, 17, 1) }
.cm-s-default .cm-string-2 { color: rgba(255, 85, 0, 1) }
.cm-s-default .cm-meta { color: rgba(85, 85, 85, 1) }
.cm-s-default .cm-qualifier { color: rgba(85, 85, 85, 1) }
.cm-s-default .cm-builtin { color: rgba(51, 0, 170, 1) }
.cm-s-default .cm-bracket { color: rgba(153, 153, 119, 1) }
.cm-s-default .cm-tag { color: rgba(17, 119, 0, 1) }
.cm-s-default .cm-attribute { color: rgba(0, 0, 204, 1) }
.cm-s-default .cm-hr { color: rgba(153, 153, 153, 1) }
.cm-s-default .cm-link { color: rgba(0, 0, 204, 1) }
.cm-s-default .cm-error { color: rgba(255, 0, 0, 1) }
.cm-invalidchar { color: rgba(255, 0, 0, 1) }
.CodeMirror-composing { border-bottom: 2px solid }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgba(0, 187, 0, 1) }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgba(170, 34, 34, 1) }
.CodeMirror-matchingtag { background: rgba(255, 150, 0, 0.3) }
.CodeMirror-activeline-background { background: rgba(232, 242, 255, 1) }
.CodeMirror { position: relative; background: rgba(245, 245, 245, 1) }
.CodeMirror-scroll { overflow: hidden !important; margin-bottom: 0; margin-right: -30px; padding: 16px 30px 16px 0; outline: none; position: relative }
.CodeMirror-sizer { position: relative; border-right: 30px solid rgba(0, 0, 0, 0) }
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none }
.CodeMirror-vscrollbar { right: 0; top: 0; overflow-x: hidden; overflow-y: scroll }
.CodeMirror-hscrollbar { bottom: 0; left: 0 !important; overflow-y: hidden; overflow-x: scroll; pointer-events: auto !important; outline: none }
.CodeMirror-scrollbar-filler { right: 0; bottom: 0 }
.CodeMirror-gutter-filler { left: 0; bottom: 0 }
.CodeMirror-gutters { position: absolute; left: 0; top: 0; min-height: 100%; z-index: 3 }
.CodeMirror-gutter { white-space: normal; height: 100%; display: inline-block; vertical-align: top; margin-bottom: -30px }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: none !important; border: none !important }
.CodeMirror-gutter-background { position: absolute; top: 0; bottom: 0; z-index: 4 }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4 }
.CodeMirror-gutter-wrapper ::selection { background-color: rgba(0, 0, 0, 0) }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: rgba(0, 0, 0, 0) }
.CodeMirror-lines { cursor: text; min-height: 1px }
.CodeMirror pre.CodeMirror-line, .CodeMirror pre.CodeMirror-line-like { -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: rgba(0, 0, 0, 0); font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; -webkit-font-variant-ligatures: contextual; font-variant-ligatures: contextual }
.CodeMirror-wrap pre.CodeMirror-line, .CodeMirror-wrap pre.CodeMirror-line-like { word-wrap: break-word; white-space: pre-wrap; word-break: normal }
.CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0 }
.CodeMirror-linewidget { position: relative; z-index: 2; padding: 0.1px }
.CodeMirror-widget { }
.CodeMirror-rtl pre { direction: rtl }
.CodeMirror-code { outline: none }
.CodeMirror-scroll, .CodeMirror-sizer, .CodeMirror-gutter, .CodeMirror-gutters, .CodeMirror-linenumber { -moz-box-sizing: content-box; box-sizing: content-box }
.CodeMirror-measure { position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden }
.CodeMirror-cursor { position: absolute; pointer-events: none }
.CodeMirror-measure pre { position: static }
div.CodeMirror-cursors { visibility: hidden; position: relative; z-index: 3 }
div.CodeMirror-dragcursors { visibility: visible }
.CodeMirror-focused div.CodeMirror-cursors { visibility: visible }
.CodeMirror-selected { background: rgba(217, 217, 217, 1) }
.CodeMirror-focused .CodeMirror-selected { background: rgba(215, 212, 240, 1) }
.CodeMirror-crosshair { cursor: crosshair }
.CodeMirror-line::selection, .CodeMirror-line>span::selection, .CodeMirror-line>span>span::selection { background: rgba(215, 212, 240, 1) }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: rgba(215, 212, 240, 1) }
.cm-searching { background: rgba(255, 255, 0, 0.4) }
.cm-force-border { padding-right: 0.1px }
@media print { .CodeMirror div.CodeMirror-cursors { visibility: hidden } }
.cm-tab-wrap-hack:after { content: "" }
span.CodeMirror-selectedtext { background: none }
.CodeMirror-activeline-background, .CodeMirror-selected { transition: visibility 0ms 100ms }
.CodeMirror-blur .CodeMirror-activeline-background, .CodeMirror-blur .CodeMirror-selected { visibility: hidden }
.CodeMirror-blur .CodeMirror-matchingbracket { color: inherit !important; outline: none !important; text-decoration: none !important }
.CodeMirror-sizer { }
.cm-s-blackboard.CodeMirror { background: rgba(12, 16, 33, 1); color: rgba(248, 248, 248, 1) }
.cm-s-blackboard div.CodeMirror-selected { background: rgba(37, 59, 118, 1) }
.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line>span::selection, .cm-s-blackboard .CodeMirror-line>span>span::selection { background: rgba(37, 59, 118, 0.99) }
.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, 0.99) }
.cm-s-blackboard .CodeMirror-gutters { background: rgba(12, 16, 33, 1); border-right: 0 }
.cm-s-blackboard .CodeMirror-guttermarker { color: rgba(251, 222, 45, 1) }
.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: rgba(136, 136, 136, 1) }
.cm-s-blackboard .CodeMirror-linenumber { color: rgba(136, 136, 136, 1) }
.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid rgba(167, 167, 167, 1) }
.cm-s-blackboard .cm-keyword { color: rgba(251, 222, 45, 1) }
.cm-s-blackboard .cm-atom { color: rgba(216, 250, 60, 1) }
.cm-s-blackboard .cm-number { color: rgba(216, 250, 60, 1) }
.cm-s-blackboard .cm-def { color: rgba(141, 166, 206, 1) }
.cm-s-blackboard .cm-variable { color: rgba(255, 100, 0, 1) }
.cm-s-blackboard .cm-operator { color: rgba(251, 222, 45, 1) }
.cm-s-blackboard .cm-comment { color: rgba(174, 174, 174, 1) }
.cm-s-blackboard .cm-string { color: rgba(97, 206, 60, 1) }
.cm-s-blackboard .cm-string-2 { color: rgba(97, 206, 60, 1) }
.cm-s-blackboard .cm-meta { color: rgba(216, 250, 60, 1) }
.cm-s-blackboard .cm-builtin { color: rgba(141, 166, 206, 1) }
.cm-s-blackboard .cm-tag { color: rgba(141, 166, 206, 1) }
.cm-s-blackboard .cm-attribute { color: rgba(141, 166, 206, 1) }
.cm-s-blackboard .cm-header { color: rgba(255, 100, 0, 1) }
.cm-s-blackboard .cm-hr { color: rgba(174, 174, 174, 1) }
.cm-s-blackboard .cm-link { color: rgba(141, 166, 206, 1) }
.cm-s-blackboard .cm-error { background: rgba(157, 30, 21, 1); color: rgba(248, 248, 248, 1) }
.cm-s-blackboard .CodeMirror-activeline-background { background: rgba(60, 54, 54, 1) }
.cm-s-blackboard .CodeMirror-matchingbracket { outline: 1px solid rgba(128, 128, 128, 1); color: rgba(255, 255, 255, 1) !important }
html, .wiz-editor-body { font-size: 12pt }
.wiz-editor-body { font-family: Helvetica, "Hiragino Sans GB", "微软雅黑", "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.7; margin: 0 auto; position: relative; padding: 20px 16px }
.wiz-editor-body h1, .wiz-editor-body h2, .wiz-editor-body h3, .wiz-editor-body h4, .wiz-editor-body h5, .wiz-editor-body h6 { margin: 1.25rem 0 0.625rem; padding: 0; font-weight: bold }
.wiz-editor-body h1 { font-size: 1.67rem }
.wiz-editor-body h2 { font-size: 1.5rem }
.wiz-editor-body h3 { font-size: 1.25rem }
.wiz-editor-body h4 { font-size: 1.17rem }
.wiz-editor-body h5 { font-size: 1rem }
.wiz-editor-body h6 { font-size: 1rem; color: rgba(119, 119, 119, 1); margin: 1rem 0 }
.wiz-editor-body div, .wiz-editor-body p, .wiz-editor-body ul, .wiz-editor-body ol, .wiz-editor-body dl, .wiz-editor-body li { margin: 8px 0 0 }
.wiz-editor-body blockquote, .wiz-editor-body table, .wiz-editor-body pre, .wiz-editor-body code { margin: 8px 0 }
.wiz-editor-body .CodeMirror pre { margin: 0 }
.wiz-editor-body a { word-wrap: break-word; text-decoration-skip-ink: none }
.wiz-editor-body ul, .wiz-editor-body ol { padding-left: 2rem }
.wiz-editor-body ol.wiz-list-level1>li { list-style-type: decimal }
.wiz-editor-body ol.wiz-list-level2>li { list-style-type: lower-latin }
.wiz-editor-body ol.wiz-list-level3>li { list-style-type: lower-roman }
.wiz-editor-body li.wiz-list-align-style { list-style-position: inside; margin-left: -1em }
.wiz-editor-body blockquote { padding: 0 12px }
.wiz-editor-body blockquote>:first-child { margin-top: 0 }
.wiz-editor-body blockquote>:last-child { margin-bottom: 0 }
.wiz-editor-body img { border: 0; max-width: 100%; height: auto !important; margin: 2px 0; padding: 2px; vertical-align: bottom }
.wiz-editor-body table { border-collapse: collapse; border: 1px solid rgba(167, 175, 188, 1) }
.wiz-editor-body td, .wiz-editor-body th { padding: 4px 8px; border-collapse: collapse; border: 1px solid rgba(167, 175, 188, 1); min-height: 28px; box-sizing: border-box }
.wiz-editor-body td>div:first-child { margin-top: 0 }
.wiz-editor-body td>div:last-child { margin-bottom: 0 }
.wiz-editor-body img.wiz-svg-image { box-shadow: 1px 1px 4px rgba(232, 232, 232, 1) }
.wiz-editor-body .wiz-image-container { margin: 0; max-width: 100%; display: inline-flex; flex-direction: column }
.wiz-editor-body .wiz-image-container .wiz-image-title { display: inline-block; text-align: center; color: rgba(167, 175, 188, 1); line-height: 18px; font-size: 12px; min-height: 18px; width: 100%; white-space: normal }
.wiz-hide { display: none !important }
.wiz-editor-body.wiz-editor-outline { padding-right: 0; padding-left: 0 }
.wiz-editor-body.wiz-editor-outline .outline-container { margin: 0; padding: 0; line-height: 1.5 }
.wiz-editor-body.wiz-editor-outline .outline-container div { margin: 0 }
.wiz-editor-body.wiz-editor-outline .node { margin: 0; padding: 0 }
.wiz-editor-body.wiz-editor-outline .outline-container>.node { margin-right: 24px; margin-left: 30px }
.wiz-editor-body.wiz-editor-outline .node.collapsed .children { display: none }
.wiz-editor-body.wiz-editor-outline .node .row { position: relative; padding-left: 26px }
.wiz-editor-body.wiz-editor-outline .node .operator-container { width: 36px; position: absolute; top: 4px; left: -18px }
.wiz-editor-body.wiz-editor-outline .node .operator-bar { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center }
.wiz-editor-body.wiz-editor-outline .node .switch { width: 18px; height: 18px; display: flex; flex-direction: column; align-items: center; overflow: hidden }
.wiz-editor-body.wiz-editor-outline .node .switch i { font-size: 20px; position: relative; left: -1px; top: -1px }
.wiz-editor-body.wiz-editor-outline .node .switch.active { cursor: pointer; color: rgba(0, 0, 0, 0); transition: transform 200ms ease 0s }
.wiz-editor-body.wiz-editor-outline .node.collapsed .switch.active { transform: rotateY(-90deg) }
.wiz-editor-body.wiz-editor-outline .node .row:hover .switch.active { color: rgba(80, 95, 121, 1) }
.wiz-editor-body.wiz-editor-outline .node .dot { display: flex; align-items: center; justify-content: center; border-radius: 100%; width: 18px; height: 18px }
.wiz-editor-body.wiz-editor-outline .node.collapsed .dot { background-color: rgba(80, 95, 121, 0.15) }
.wiz-editor-body.wiz-editor-outline .node .dot-icon { background-color: rgba(80, 95, 121, 1); border-radius: 100%; width: 6px; height: 6px }
.wiz-editor-body.wiz-editor-outline .node .child { margin-left: 8px; border-left: 1px solid rgba(230, 233, 237, 1); padding-left: 17px }
.wiz-editor-body.wiz-editor-outline .node .content { flex: 1; outline: none; padding: 4px 0 }
.wiz-editor-body.wiz-editor-outline .node div.content { font-size: 1rem }
.wiz-editor-body.wiz-editor-outline .node.complete>.row .content { text-decoration: line-through; color: rgba(167, 175, 188, 1) }
.wiz-editor-body.wiz-editor-outline .node .notes { outline: none; font-size: 0.8rem; color: rgba(167, 175, 188, 1) }
.wiz-editor-body.wiz-editor-outline .node .image { outline: none; padding-top: 4px; padding-bottom: 4px }
.wiz-editor-body.wiz-editor-outline .outline-container h1, .wiz-editor-body.wiz-editor-outline .outline-container h2, .wiz-editor-body.wiz-editor-outline .outline-container h3, .wiz-editor-body.wiz-editor-outline .outline-container h4, .wiz-editor-body.wiz-editor-outline .outline-container h5, .wiz-editor-body.wiz-editor-outline .outline-container h6 { margin: 0 }
body, .wiz-editor-body { padding-left: 48px; padding-right: 48px }

安装Nuget包
IdentityModel 版本3.10.10
Microsoft.AspNetCore.Authorization 版本2.2.0
Microsoft.AspNetCore.Authentication.JwtBearer 版本2.2.0

 
 
 
 
 

3
 
 
 
 
 
1
IdentityModel 版本3.10.10
2
Microsoft.AspNetCore.Authorization 版本2.2.0
3
Microsoft.AspNetCore.Authentication.JwtBearer 版本2.2.0
 
 
public class JwtSettings
{
/// <summary>
/// token是谁颁发的
/// </summary>
public string Issuer { get; set; }

/// <summary>
/// token可以给那些客户端使用
/// </summary>
public string Audience { get; set; }

/// <summary>
/// 加密的key(SecretKey必须大于16个,是大于,不是大于等于)
/// </summary>
public string SecretKey { get; set; }
}

 
 
 
 
 

17
 
 
 
 
 
1
public class JwtSettings
2
    {
3
        /// <summary>
4
        /// token是谁颁发的
5
        /// </summary>
6
        public string Issuer { get; set; }
7

8
        /// <summary>
9
        /// token可以给那些客户端使用
10
        /// </summary>
11
        public string Audience { get; set; }
12

13
        /// <summary>
14
        /// 加密的key(SecretKey必须大于16个,是大于,不是大于等于)
15
        /// </summary>
16
        public string SecretKey { get; set; }
17
    }
 
 
appsetting配置添加
,
"JwtSettings": {
"Issuer": "https://localhost:44336", //谁颁发的
"Audience": "https://localhost:44336", //允许谁使用
"SecretKey": "Hello-key----------" //加密密钥大于16
}

 
 
 
 
 

6
 
 
 
 
 
1
,
2
  "JwtSettings": {
3
    "Issuer": "https://localhost:44336",//谁颁发的
4
    "Audience": "https://localhost:44336",//允许谁使用
5
    "SecretKey": "Hello-key----------"//加密密钥大于16
6
  }
 
 
startup注入服务
ConfigureServices()里面添加
/*注入Jwt服务*/

//将appsettings.json中的JwtSettings部分文件读取到JwtSettings中,这是给其他地方用的
services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
var jwtsettings = new JwtSettings();
//将配置绑定到JwtSettings实例中
Configuration.Bind("JwtSettings", jwtsettings);
//添加身份验证
services.AddAuthentication(options=> {
//认证middleware配置
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).
AddJwtBearer(o =>
{
//jwt token参数设置
o.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = JwtClaimTypes.Name,
RoleClaimType = JwtClaimTypes.Role,
//Token颁发机构
ValidIssuer = jwtsettings.Issuer,
//颁发给谁
ValidAudience = jwtsettings.Audience,
//这里的key要进行加密
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsettings.SecretKey)),

/***********************************TokenValidationParameters的参数默认值***********************************/
// RequireSignedTokens = true,
// SaveSigninToken = false,
// ValidateActor = false,
// 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。
// ValidateAudience = true,
// ValidateIssuer = true,
// ValidateIssuerSigningKey = false,
// 是否要求Token的Claims中必须包含Expires
// RequireExpirationTime = true,
// 允许的服务器时间偏移量
// ClockSkew = TimeSpan.FromSeconds(300),
// 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
// ValidateLifetime = true
};
});
/*声明授权*/
services.AddAuthorization(options =>
{
options.AddPolicy("IsUser", policy => policy.RequireClaim("IsAdmin", "false"));
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("IsAdmin", "true"));
/*角色*/
//options.AddPolicy("IsAdmin", policy => policy.RequireRole("Administrator", "admin","member"));
});

configure()里面添加
//身份授权认证
app.UseAuthentication();
app.UseHttpsRedirection();

 
 
 
 
 

57
 
 
 
 
 
1
ConfigureServices()里面添加
2
            /*注入Jwt服务*/
3

4
            //将appsettings.json中的JwtSettings部分文件读取到JwtSettings中,这是给其他地方用的
5
            services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
6
            var jwtsettings = new JwtSettings();
7
            //将配置绑定到JwtSettings实例中
8
            Configuration.Bind("JwtSettings", jwtsettings);
9
            //添加身份验证
10
            services.AddAuthentication(options=> {
11
                //认证middleware配置
12
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
13
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
14
            }).
15
            AddJwtBearer(o =>
16
            {
17
                //jwt token参数设置
18
                o.TokenValidationParameters = new TokenValidationParameters
19
                {
20
                    NameClaimType = JwtClaimTypes.Name,
21
                    RoleClaimType = JwtClaimTypes.Role,
22
                    //Token颁发机构
23
                    ValidIssuer = jwtsettings.Issuer,
24
                    //颁发给谁
25
                    ValidAudience = jwtsettings.Audience,
26
                    //这里的key要进行加密
27
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsettings.SecretKey)),
28

29
                    /***********************************TokenValidationParameters的参数默认值***********************************/
30
                    // RequireSignedTokens = true,
31
                    // SaveSigninToken = false,
32
                    // ValidateActor = false,
33
                    // 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。
34
                    // ValidateAudience = true,
35
                    // ValidateIssuer = true, 
36
                    // ValidateIssuerSigningKey = false,
37
                    // 是否要求Token的Claims中必须包含Expires
38
                    // RequireExpirationTime = true,
39
                    // 允许的服务器时间偏移量
40
                    // ClockSkew = TimeSpan.FromSeconds(300),
41
                    // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
42
                    // ValidateLifetime = true
43
                };
44
            });
45
            /*声明授权*/
46
            services.AddAuthorization(options =>
47
            {
48
                options.AddPolicy("IsUser", policy => policy.RequireClaim("IsAdmin", "false"));
49
                options.AddPolicy("IsAdmin", policy => policy.RequireClaim("IsAdmin", "true"));
50
                /*角色*/
51
                //options.AddPolicy("IsAdmin", policy => policy.RequireRole("Administrator", "admin","member"));
52
            });
53

54
configure()里面添加
55
            //身份授权认证
56
            app.UseAuthentication();
57
            app.UseHttpsRedirection();
 
 
依赖注入,要验证的地方添加[Authorize],运行未验证的用户访问[AllowAnonymous]
namespace Jwt.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{

//获取JwtSettings对象信息
private JwtSettings _jwtSettings;
public WeatherForecastController(IOptions<JwtSettings> _jwtSettingsAccesser)
{
_jwtSettings = _jwtSettingsAccesser.Value;
}

/// <summary>
/// 获取token
/// </summary>
/// <param name="user"></param>
private object Token(user model)
{
//测试自己创建的对象
var user = new user
{
id = 1,
username = "138000000",
password = "e10adc3949ba59abbe56e057f20f883e"
};
var tokenHandler = new JwtSecurityTokenHandler();

var key = Encoding.UTF8.GetBytes(_jwtSettings.SecretKey);
var authTime = DateTime.Now;//授权时间
var expiresAt = authTime.AddDays(0.1);//过期时间
var tokenDescripor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[] {
new Claim(JwtClaimTypes.Audience,_jwtSettings.Audience),
new Claim(JwtClaimTypes.Issuer,_jwtSettings.Issuer),
new Claim(JwtClaimTypes.Name, user.username.ToString()),
new Claim("IsMember", member), //声明授权
}),
Expires = expiresAt,
//对称秘钥SymmetricSecurityKey
//签名证书(秘钥,加密算法)SecurityAlgorithms
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescripor);
var tokenString = tokenHandler.WriteToken(token);
var result = new
{
access_token = tokenString,
token_type = "Bearer",
profile = new
{
id = user.id,
name = user.username,
phone = user.username,
auth_time = authTime,
expires_at = expiresAt
}
};
return result;
}

[HttpGet]
[Route("get_token")]
public IActionResult Get()
{
return Ok(Token(null));
}

[Authorize(Policy = "IsUser")]
[Authorize(Policy = "IsAdmin")]
[Route("get_user_info")]
[HttpGet]
public IActionResult GetUserInfo()
{
//获取当前请求用户的信息,包含token信息
var user = HttpContext.User;

return Ok(
new
{
Issuer = base.User.Identity.Name,
message = "HAHA",
Issure2 = user.Identity,
user = user.Claims.Count(),
user1 = user.Claims.ElementAt(0).Value,
user2 = user.Claims.ElementAt(1).Value,
user3 = user.Claims.ElementAt(2).Value,
user4 = user.Claims.ElementAt(3).Value,
user5 = user.Claims.ElementAt(4).Value,
user6 = user.Claims.ElementAt(5).Value,
user7 = user.Claims.ElementAt(6).Value,
user8 = user.Claims.ElementAt(7).Value,
}) ;
}
}
}

 
 
 
 
 

100
 
 
 
 
 
1
namespace Jwt.Controllers
2
{
3
    [ApiController]
4
    [Route("[controller]")]
5
    public class WeatherForecastController : ControllerBase
6
    {
7

8
        //获取JwtSettings对象信息
9
        private JwtSettings _jwtSettings;
10
        public WeatherForecastController(IOptions<JwtSettings> _jwtSettingsAccesser)
11
        {
12
            _jwtSettings = _jwtSettingsAccesser.Value;
13
        }
14

15
        /// <summary>
16
        /// 获取token
17
        /// </summary>
18
        /// <param name="user"></param>
19
        private object Token(user model)
20
        {
21
            //测试自己创建的对象
22
            var user = new user
23
            {
24
                id = 1,
25
                username = "138000000",
26
                password = "e10adc3949ba59abbe56e057f20f883e"
27
            };
28
            var tokenHandler = new JwtSecurityTokenHandler();
29

30
            var key = Encoding.UTF8.GetBytes(_jwtSettings.SecretKey);
31
            var authTime = DateTime.Now;//授权时间
32
            var expiresAt = authTime.AddDays(0.1);//过期时间
33
            var tokenDescripor = new SecurityTokenDescriptor
34
            {
35
                Subject = new ClaimsIdentity(new Claim[] {
36
                    new Claim(JwtClaimTypes.Audience,_jwtSettings.Audience),
37
                    new Claim(JwtClaimTypes.Issuer,_jwtSettings.Issuer),
38
                    new Claim(JwtClaimTypes.Name, user.username.ToString()),
39
                    new Claim("IsMember", member),  //声明授权
40
                }),
41
                Expires = expiresAt,
42
                //对称秘钥SymmetricSecurityKey
43
                //签名证书(秘钥,加密算法)SecurityAlgorithms
44
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
45
            };
46
            var token = tokenHandler.CreateToken(tokenDescripor);
47
            var tokenString = tokenHandler.WriteToken(token);
48
            var result = new
49
            {
50
                access_token = tokenString,
51
                token_type = "Bearer",
52
                profile = new
53
                {
54
                    id = user.id,
55
                    name = user.username,
56
                    phone = user.username,
57
                    auth_time = authTime,
58
                    expires_at = expiresAt
59
                }
60
            };
61
            return result;
62
        }
63

64

65
        [HttpGet]
66
        [Route("get_token")]
67
        public IActionResult Get()
68
        {
69
            return Ok(Token(null));
70
        }
71

72
        [Authorize(Policy = "IsUser")]
73
        [Authorize(Policy = "IsAdmin")]
74
        [Route("get_user_info")]
75
        [HttpGet]
76
        public IActionResult GetUserInfo()
77
        {
78
            //获取当前请求用户的信息,包含token信息
79
            var user = HttpContext.User;
80

81
            return Ok(
82
                new
83
                {
84
                    Issuer = base.User.Identity.Name,
85
                    message = "HAHA",
86
                    Issure2 = user.Identity,
87
                    user = user.Claims.Count(),
88
                    user1 = user.Claims.ElementAt(0).Value,
89
                    user2 = user.Claims.ElementAt(1).Value,
90
                    user3 = user.Claims.ElementAt(2).Value,
91
                    user4 = user.Claims.ElementAt(3).Value,
92
                    user5 = user.Claims.ElementAt(4).Value,
93
                    user6 = user.Claims.ElementAt(5).Value,
94
                    user7 = user.Claims.ElementAt(6).Value,
95
                    user8 = user.Claims.ElementAt(7).Value,
96
                }) ;
97
        }
98
    }
99
}
100

 
 
创建token
依赖注入
注入服务
注入服务1
获取信息
 
 

Asp .net core JWT验证的更多相关文章

  1. ASP.NET与ASP.NET Core用户验证Cookie并存解决方案

    在你将现有的用户登录(Sign In)站点从ASP.NET迁移至ASP.NET Core时,你将面临这样一个问题——如何让ASP.NET与ASP.NET Core用户验证Cookie并存,让ASP.N ...

  2. ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 验证特性 上一章节我们简单介绍了 ...

  3. ASP.NET Core身份验证

    asp.net core 身份验证 本文旨在演示如果使用内置的 identity 实现 asp.net core 的身份验证,不会进行其它扩展.本文将通过最简单的代码演示如何进行登录和身份验证操作. ...

  4. ASP.NET Core 模型验证的一个小小坑

    今天在我们的一个项目中遇到一个 asp.net core 模型验证(model validation)的小问题.当模型属性的类型是 bool ,而提交上来的该属性值是 null ,asp.net co ...

  5. ASP.NET Core 身份验证(一)

    前言 这篇文章我想带领大家了解一下 ASP.NET Core 中如何进行的身份验证,在开始之前强烈建议还没看过我写的 Identity 系列文章的同学先看一下. Identity 入门系列文章: Id ...

  6. 理解 ASP.NET Core: 验证

    ASP.NET Core 验证 通常在应用程序中,安全分为前后两个步骤:验证和授权.验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源. 既然安全从验证开始 ...

  7. ASP.NET Core - JWT认证实现

    一.JWT结构 JWT介绍就太多了,这里主要关注下Jwt的结构. Jwt中包含三个部分:Header(头部).Payload(负载).Signature(签名) Header:描述 JWT 的元数据的 ...

  8. ASP.NET Core身份验证服务框架IdentityServer4-整体介绍

    一.整体情况 现代应用程序看起来更像这个: 最常见的相互作用: 浏览器与Web应用程序的通信 Browser -> Web App Web应用程序与Web API通信 基于浏览器的应用程序与We ...

  9. CZGL.Auth: ASP.NET Core Jwt角色授权快速配置库

    CZGL.Auth CZGL.Auth 是一个基于 Jwt 实现的快速角色授权库,ASP.Net Core 的 Identity 默认的授权是 Cookie.而 Jwt 授权只提供了基础实现和接口,需 ...

  10. Asp.Net Core 客户端验证和远程验证

    我们先来看这样一个注册页面和它的后台Model @model RegisterViewModel @{ ViewBag.Title = "用户注册"; } <h1>用户 ...

随机推荐

  1. 本地连接bat脚本

    1设置静态ip地址(1) netsh interface ip set address name="网络名" source=static addr=ip地址 mask=子网掩码 g ...

  2. Linux安装hive

    1.需要先安装hadoop以及mysql,参考其他文章 安装hive和hadoop都在hadoop用户目录下 2.安装hive,之前,先在mysql上创建一个hive,数据库,并在hive数据库中建立 ...

  3. 另辟新径实现 Blazor/MAUI 本机交互(二)

    Maui 基础 Preferences 是 .NET MAUI 提供的一个静态类,用于存储和检索应用程序的首选项(即设置或配置).它提供了一种简单的键值对存储机制,可以跨平台使用.每个平台使用其本地的 ...

  4. 最新demo版 | 如何0-1开发支付宝小程序之小程序页面功能介绍(三)

    前两期讲了小程序开发的准备工作以及前期需要如何调试,今天我们就来介绍下开发一个支付宝小程序页面需要了解哪些信息. 一个小程序页面的整体功能的构成离不开页面展示(AXML).页面样式(ACSS)以及页面 ...

  5. WPF DevExpress GridColumn ComboBox 显示选择内容的 TooTip

    实现显示当前选择的ComboBox中项的ToolTip信息: 1. 设置 GridColumn 的 CellTemplate 为 ComboBoxEdit , 然后自定义他的 ItemContaine ...

  6. [ABC213G] Connectivity 2 题解

    好好好. 我们设当前处理 \(i\) 的答案,那么最后的图就可以分成两个部分:\(1\) 所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积. 设 \(f_s\) 表示集合 \(s\) 中所 ...

  7. JUC并发—11.线程池源码分析

    大纲 1.线程池的优势和JUC提供的线程池 2.ThreadPoolExecutor和Excutors创建的线程池 3.如何设计一个线程池 4.ThreadPoolExecutor线程池的执行流程 5 ...

  8. 计数类 dp 做题记录(长期更新)

    前言 因为本人太弱,急需锻炼思维,固从现在起开始着手写计数题,并写下题解分析思路的欠缺.另外本文将长时间更新,所以我准备把它置顶,尽量日更! upd on 24.11.6 现版本改成长期更新. P36 ...

  9. VUE-CLI 创建VUE3项目

    前言 第一篇当然是如何安装vue3 安装步骤 第一步安装vue-cli npm install -g @vue/cli // vue --version 第二步创建项目 vue create hell ...

  10. 【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据

    用conversion shell element (S4R单元)建模层合板,有6层ply,每个lamina(ply)有3个 integration point,共计18个integration po ...