文章正文

.NET8.0 使用学习(二)项目中使用配置Swagger,配合使用JWT

加入时间:2025/8/28 17:51:44

.NET8.0中使用Swagger需要第三方插件支持,根据创建项目不同,有的可能已经有部分插件安装,总之需要安装下面三个Swagger的相关组件

Swashbuckle.AspNetCore.SwaggerGen

Swashbuckle.AspNetCore.SwaggerUI

Program.cs代码中的代码如下

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

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme
    {
        Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token} (注意两者之间是一个空格)",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http, // ✅ 这是 HTTP 类型
        Scheme = "bearer",            // ✅ 表示 Bearer Token
        BearerFormat = "JWT"          // 可选,UI 提示
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "bearerAuth"
                }
            },
            Array.Empty<string>()
        }
    });

    // 加载当前程序集的 XML 文档(即你的 /// 注释)
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    if (File.Exists(xmlPath))
    {
        c.IncludeXmlComments(xmlPath);
    }
});

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,

        // ⚠️ 以下是你自己定义的,需要和生成 Token 时保持一致
        ValidIssuer = "MyApp",           // Token 签发者
        ValidAudience = "MyAppUsers",       // Token 接收者
        IssuerSigningKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes("ThisIsASecretKeyForJWTAndItMustBeAtLeast32CharactersLong!!!"))
    };
});
// =============================================
// 1. 添加 MVC(用于 Razor 页面 / 前台页面)
// =============================================
builder.Services.AddControllersWithViews(); // ✅ 支持 MVC 和 Razor 视图

// =============================================
// 2. 添加 API 支持(用于返回 JSON 的接口)
// =============================================
builder.Services.AddControllers(); // ✅ 支持 [ApiController] 或 ControllerBase

// =============================================
// 3. 添加授权服务
// =============================================
builder.Services.AddAuthorization();

var app = builder.Build();


app.UseRouting();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"));
}
// =============================================
// 5. 启用认证与授权中间件(顺序很重要!)
// =============================================
app.UseAuthentication(); // 先认证
app.UseAuthorization();  // 后授权

// =============================================
// 6. 配置路由
// =============================================

// MVC 路由(比如 /Home/Index, /Home/About)
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

// API 路由(比如 /api/auth/login, /api/secure/hello)
app.MapControllers();

app.Run();

配合安装下面的类库

Microsoft.AspNetCore.Authentication.JwtBearer

登录成功后通过调用下面的方面生成token

       private string GenerateJwtToken(string username, string[] roles)
       {
           var claims = new List<Claim>
           {
               new Claim(JwtRegisteredClaimNames.Sub, username),
               new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
               new Claim(ClaimTypes.Name, username)
           };

           foreach (var role in roles)
           {
               claims.Add(new Claim(ClaimTypes.Role, role));
           }

           var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(
               "ThisIsASecretKeyForJWTAndItMustBeAtLeast32CharactersLong!!!"));
           var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

           var token = new JwtSecurityToken(
               issuer: "MyApp",
               audience: "MyAppUsers",
               claims: claims,
               expires: DateTime.Now.AddMinutes(60),
               signingCredentials: creds);

           return new JwtSecurityTokenHandler().WriteToken(token);
       }

 

 

字体大小[ ]

版权所有:有信心——uxinxin 我的个人网站欢迎常来!手机版(新站开启,请多多关照) 豫ICP备12017930号-1
 豫公网安备41910102000493号