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. 2024 MWC上海,“翼”彩纷呈!

    2024年6月26日,2024世界移动通信大会上海(简称"MWC上海")盛大开幕.围绕"未来先行"主题,来自全球的产业.技术和社区等各界代表齐聚一堂,共话产业高 ...

  2. 一键部署,玩转AI!天翼云Llama 3大模型学习机来了!

    近日,Meta公司发布了其最新研发成果--开源大模型Llama 3,共包含Llama 3 8B和Llama 3 70B两种规格,参数量级分别为80亿与700亿,并表示这是目前同体量下性能最好的开源模型 ...

  3. CF1326G 题解

    题意: 蛛网树是一颗平面树,满足点是该树的凸包的顶点上等价于其是叶子. 给定一个平面树,求有多少种对点集的划分,使得每个划分出来的集合都是蛛网树. Solution 考虑树形 dp.设 \(f_u\) ...

  4. linux创建快捷方式

    第一方法设置软连接 ln -s test.log test2.log     第二方法 第一步 新建 /usr/share/applications 目录下的某个快捷方式文件 如 touch /usr ...

  5. ORACLE 分页排序后的数据重复或缺失问题

    今天一大早业务人员就反映说用户导出的订单数据,有好几单是重复,并且缺失了某一单. 第一步:查询数据表.表里实际数据没有重复,也没有缺失.那么就可能是导出过程出错了(因为是异步分页导出,所以最先怀疑这部 ...

  6. What?废柴, 还在本地部署DeepSeek吗?Are you kidding?

    前言 DeepSeek推出更强大的推理模型DeepSeek R1后一发不可收拾,迅速火遍全球,用户暴增,但巨大的流量以及一些不可控因素,DeepSeek官网变得极不稳定,经常出现"网络繁忙& ...

  7. KUKA库卡机器人KR120维修故障参考方案

    随着智能制造的飞速发展,KUKA库卡机器人KR120以其稳定的特点,在自动化生产线上扮演着举足轻重的角色.然而,任何机械设备在长期运行过程中都难免会遇到故障.本文将针对KUKA库卡机器人KR120维修 ...

  8. SQLSugar 支持 TDengine 超级表的使用指南

    TDengine 是一款高性能.分布式的时序数据库,广泛应用于物联网.工业互联网等领域.其核心概念之一是超级表(Super Table),它类似于传统数据库中的表结构模板,允许用户通过标签(Tag)动 ...

  9. win7系统安装mysql新建数据库/数据表及故障处理,安装mysql后net start mysql服务无法启动

    问题描述:win7系统安装mysql,安装mysql后net start mysql服务无法启动 1.下载mysql: 官网地址:https://dev.mysql.com/downloads/mys ...

  10. Jsoncpp的安装与使用方式

    JsonCpp 是一个C++库,用于解析和生成JSON数据.它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式. 安装Jsoncpp 我们可以输入以下命令安装jsoncp ...