Asp.Net Core 使用JWT,Swagger中帶報文頭

Programme.cs

 

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Text;
using WebApiYzk.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();

//這裏給Swagger指定說要使用Authorization 在swagger頁面會出現一個小鎖按鈕,輸入 jwttoken就行了
builder.Services.AddSwaggerGen(c =>
{
    var scheme = new OpenApiSecurityScheme()
    {
        Description = "Authorization header. \r\nExample: 'Bearer 12345abcdef'",
        Reference = new OpenApiReference
        {
            Type = ReferenceType.SecurityScheme,
            Id = "Authorization"
        },
        Scheme = "oauth2",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
    };
    c.AddSecurityDefinition("Authorization", scheme);
    var requirement = new OpenApiSecurityRequirement();
    requirement[scheme] = new List<string>();
    c.AddSecurityRequirement(requirement);
});
//從配置文件中讀取 JWT 節點,轉換到 JwtOption對象上,在Login方法的 FromService 時用
builder.Services.Configure<JwtOption>(builder.Configuration.GetSection("JWT"));
//註冊JwtBear,設置一些驗證的項
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(x => { 
    var jwtOpt = builder.Configuration.GetSection("JWT").Get<JwtOption>();
    byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey);
    var scrkey = new SymmetricSecurityKey(keyBytes);
    x.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = scrkey
    };

});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
//認證 需要加這個中間件
app.UseAuthentication();
//授權
app.UseAuthorization();

app.MapControllers();

app.Run();
View Code

 

寫一個Login返回jwttoken

 

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using WebApiYzk.Models;

namespace WebApiYzk.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LoginController : ControllerBase
    {
        [HttpPost]
        public async Task<IActionResult> Login(LoginRequest rq,[FromServices]IOptionsSnapshot<JwtOption> jwtOptions)
        {
            if (rq.UserName != "admin")
                return NotFound("沒有找到");
            var claims = new List<Claim>();
            claims.Add(new Claim(ClaimTypes.NameIdentifier, rq.UserName));
            claims.Add(new Claim(ClaimTypes.Role, "管理員"));
            string jwtToken = BuildToken(claims, jwtOptions.Value);
            return Ok(jwtToken);


        }
        private static string BuildToken(IEnumerable<Claim> claims, JwtOption options)
        {
            DateTime expires = DateTime.Now.AddSeconds(options.ExpireSeconds);
            byte[] keyBytes = Encoding.UTF8.GetBytes(options.SigningKey);
            var secKey = new SymmetricSecurityKey(keyBytes);
            var credentials = new SigningCredentials(secKey,
                SecurityAlgorithms.HmacSha256Signature);
            var tokenDescriptor = new JwtSecurityToken(expires: expires,
                signingCredentials: credentials, claims: claims);
            return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
        }
    }
}
View Code

 

寫一個方法,需要驗證登錄信息後才能訪問:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace WebApiYzk.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class SayHiController : ControllerBase
    {
        [HttpGet]
        public IActionResult Hello()
        {
            string id = this.User.FindFirst(ClaimTypes.NameIdentifier)!.Value;
            string userName = this.User.FindFirst(ClaimTypes.NameIdentifier)!.Value;
            IEnumerable<Claim> roleClaims = this.User.FindAll(ClaimTypes.Role);
            string roleNames = string.Join(',', roleClaims.Select(c => c.Value));
            return Ok($"id={id},userName={userName},roleNames ={roleNames}");
        }
    }
}
View Code

 

用到的類

 public class JwtOption
    {
        public string SigningKey { get; set; }
        public int ExpireSeconds { get; set; }
    }

    public class Role : IdentityRole<long>
    {
    }

    public class User : IdentityUser<long>
    {
        public string UserName { get; set; }
        public DateTime CreatTime { get; set; }
    }

    public class LoginRequest
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }
View Code

 

這只是基礎例子,可以看楊老師源碼,多了一些內容

視頻:

Part5-7:讓Swagger中帶JWT報文頭_嗶哩嗶哩_bilibili

NETBookMaterials/第八章/ASPNETCore_JWT1 at main · yangzhongke/NETBookMaterials · GitHub

 

自己可見:第八章/ASPNETCore_JWT1 · 物華天寶/NETBookMaterials - 碼雲 - 開源中國 (gitee.com)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章