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. golang轻量级版本管理工具g安装使用

    使用 g 可以在 windows 上切换使用不同版本的 golang GitHub仓库地址 https://github.com/voidint/g GitHub下载连接 https://github ...

  2. protocol buffers(protobuf)安装教程

    本文按照mac讲解protobuf的安装,windows上比较好安装按照mac的基本流程就可以安装成功,mac上的安装有的时候比较容易出现问题 一.通过brew的方式安装(仅Mac) 需要mac中存在 ...

  3. SQL注入之联合查询注入

    SQL注入之联合查询注入 一.联合查询注入原理 联合查询注入是一种常见的SQL注入攻击手法,其核心原理是利用SQL中的UNION操作符将多个SELECT语句的结果集合并,从而返回一个统一的结果集.在使 ...

  4. 搭建基于Grafana+JMeter+InfluxDB的性能监控与分析平台(Linux)

    搭建基于Grafana+JMeter+InfluxDB的性能监控与分析平台(Linux版) 在软件开发和运维领域,性能监控与分析是确保应用稳定性和用户体验的关键环节.随着应用规模的不断扩大和复杂度的增 ...

  5. PC端自动化测试实战教程-1-pywinauto 环境搭建(详细教程)

    1.简介 之前总有人在群里或者私信留言问:Windows系统安装的软件如何自动化测试呢?因为没有接触过或者遇到过,所以说实话宏哥当时也不清楚怎么实现,怎么测试.然而在一次偶然的机会接触到了Python ...

  6. C#/.NET/.NET Core技术前沿周刊 | 第 26 期(2025年2.10-2.16)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  7. VSCode Romote SSH连接远程主机经常初始化?10个解决方法!!

    解决方法: 删除远程主机上的 .vscode-server 文件夹:这个文件夹包含 VSCode 的远程服务器组件.如果这个文件夹损坏或配置不正确,会导致连接问题.删除并重新安装可以确保服务器组件是干 ...

  8. DeFi(去中心化金融)的硬核知识

    1. ​DeFi流动性挖矿:躺着赚利息的"矿工"​ 简单来说,流动性挖矿就像你往银行存钱赚利息,但这里存的是加密货币,利息更高,还能随时提现.比如你往Uniswap这样的去中心化交 ...

  9. C#枚举帮助EnumHelper

    1 public class EnumHelper 2 { 3 #region 获取枚举 4 public static List<EnumValue> GetEnumList(Type ...

  10. python3 ModuleNotFoundError: No module named 'CommandNotFound'

    前言 python3 报错:ModuleNotFoundError: No module named 'CommandNotFound' 这是 linux 安装多版本 python 时的一个遗留问题, ...