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. springboot集成测试最小化依赖实践

    目录 简介 版本及依赖引入 springboot版本 项目部分依赖 直接使用SpringBootTest方式 代码示例 场景及优劣 最小化依赖方案 代码 思路及步骤 最小化依赖方案的优点 结论 简介 ...

  2. JS深度理解

    事件循环 程序运行需要有自己专属的内存空间,可以把这块内存简单理解为进程 每个应用至少有一个进程,进程间相互独立,要通信,也需要双方同意 线程 有进程后,就可以运行程序的代码 运行代码的 [人] 称为 ...

  3. 银杏叶也是yxy

    今年下半年(9月后)第一个使我震撼而狂喜的书籍,金阁寺. 翻译是林少华.他翻译这个可比村上春树好多了 一切都像梦寐一般,一切都如此完美 完美的结构,完美的心理叙述,撕心裂肺的景色描写 战后无限的虚无与 ...

  4. linux系统ntp时间同步

    linux系统ntp时间同步 概要 linux系统时间同步有ntp和chrony两种不同实现方式. 两者相比chrony性能更优,如果系统支持,那么能够使用chrony尽量使用它. chrony 具有 ...

  5. useradd usermod userdel passwd groupadd groupmod groupdel等命令详解

    linux命令参数记忆有些模糊了,记录下.学而时习之,不亦说乎? 1.useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是终极用户.创建新用户useradd,默认的用户家目录会被存放在/ ...

  6. Project Euler 307 题解

    主要是规避误差.即求 \[\frac{k![x^k](1+x+\frac {x^2}2)^n}{n^k} \] 微分一下得到递推式.然后根据斯特林近似(byd 这里还需要 \(1\) 后的第一项..) ...

  7. [国家集训队] happiness 题解

    发现可以做如下建图: 对于前两组输入,从 \(s\) 向所有代表学生的点连一条边,容量为其学习文科的喜悦值:从所有代表学生的点向 \(t\) 连一条边,容量为其学习理科的最大值. 对于后四组输入,建两 ...

  8. [SCOI2007] 蜥蜴 题解

    发现实际上就是在求有多少只蜥蜴能逃出来. 发现可以将柱子拆成入点和出点两部分,自己的出点向别人的入点连边,自己的入点向自己的出点连边.最后再加一个超级源点 \(S\),连接所有有蜥蜴的柱子入点:再加一 ...

  9. ABB机器人IRB1600齿轮箱维修故障四大原因

    一.ABB机器人IRB1600齿轮箱齿轮磨损 齿轮磨损是IRB1600齿轮箱常见的故障.长时间的高速运转和负载作用会导致齿轮表面磨损,进而产生噪音和振动.维修时,需要对磨损的齿轮进行更换,同时检查相邻 ...

  10. 记线上+线下培训思想i技巧感悟

    刚刚结束一场线下+线上培训 梳理一下,有几个问题: 1.虽然课件自己过了几遍,同时备注里写了一些提示 ,但是真正讲课的时候基本是没有过程特意去扫备注 注意备注应清晰,写核心关键字 2.分屏过程 需要在 ...