一:使用swagger基本使用后台API
使用NuGet 包管理器下載Swashbuckle.AspNetCore
在Startup類的ConfigureServices方法里面注入服務:
public void ConfigureServices(IServiceCollection services) { services.AddSwaggerGen(m => { m.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" }); }); services.AddControllers(); }
在Startup類的Configure方法里面添加Swagger有關的中間件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); // 添加Swagger有關中間件 app.UseSwagger(); app.UseSwaggerUI(m => { m.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API"); }); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
默認啟用swagger ui頁面,需要修改launchSettings.json中的profiles:launchUrl:"swagger/index.html"
如果想直接在域名的根目錄直接加載 swagger 比如訪問:localhost:8001 就能訪問,可以這樣設置:
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API"); c.RoutePrefix = "";//路徑配置,設置為空,表示直接訪問該文件,
//路徑配置,設置為空,表示直接在根域名(localhost:8001)訪問該文件,注意localhost:8001/swagger是訪問不到的,
//這個時候去launchSettings.json中把"launchUrl": "swagger/index.html"去掉, 然后直接訪問localhost:8001/index.html即可 });
如果需要方法的注釋和方法參數的注釋,需要對接口做XML注釋:
//安裝Microsoft.Extensions.PlatformAbstractions包
項目右鍵,選擇屬性----生成,勾選“XML文檔文件”,不想每一個方法都這么加注釋,可以忽略警告,加上分號 ;1591:
修改ConfigureServices方法,增加下面的方法:
public void ConfigureServices(IServiceCollection services) { // 添加Swagger services.AddSwaggerGen(m => { m.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" }); // 獲取xml文件名 var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; // 獲取xml文件路徑 var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); // 添加控制器層注釋,true表示顯示控制器注釋 m.IncludeXmlComments(xmlPath, true); }); services.AddControllers(); }
使用JWT進行用戶認證,Swagger中開啟JWT服務
安裝包:Microsoft.AspNetCore.Authentication.JwtBearer
在ConfigureServices方法中修改swagger配置:
//swagger配置 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" }); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "JWT授權(數據將在請求頭中進行傳遞)直接在下面框中輸入Bearer {token}(注意兩者之間是一個空格) \"", Name = "Authorization",//jwt默認的參數名稱 In = ParameterLocation.Header,//jwt默認存放Authorization信息的位置(請求頭中) Type = SecuritySchemeType.ApiKey }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty<string>() } }); });
在appsetting.json里設置JWT Token需要的一些參數:
"tokenParameter": { "secret": "D96BFA5B-F2AF-45BC-9342-5A55C3F9BBB0", //JWT加密的密鑰。 "issuer": "WebServer", //簽發人的名稱 "audience": "WebClient", //訂閱人的名稱 "accessExpiration": 120, //Token的有效分鍾數。過了這個時間,這個Token會過期。 "refreshExpiration": 1440 // refreshToken的有效分鍾數。過了這個時間,用戶需要重新登錄。 }
創建一個映射tokenParameter的類,也可以直接讀配置,再轉成數據:
public class TokenParameter { public string Secret { get; set; } public string Issuer { get; set; } public string Audience { get; set; } public int AccessExpiration { get; set; } public int RefreshExpiration { get; set; } }
在Startup類的ConfigureServices方法里面添加JWT認證:
services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(option => { option.RequireHttpsMetadata = false; option.SaveToken = true; var token = Configuration.GetSection("TokenParameter").Get<TokenParameter>(); option.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true,//是否驗證Issuer ValidateAudience = true,//是否驗證Audience ValidateLifetime = true,//是否驗證失效時間 ValidateIssuerSigningKey = true,//是否驗證SecurityKey ValidAudience = token.Audience,//Audience ValidIssuer = token.Issuer,//Issuer,這兩項和簽發jwt的設置一致 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(token.Secret))//拿到SecurityKey }; });
在Startup類的Configure方法里面添加有關認證:
app.UseAuthentication();
app.UseAuthorization();
在Controllers添加AuthenticationController控制器,需要token認證的 [Authorize],不需要加增加 [AllowAnonymous] 特性:
[Route("[controller]/[Action]")] [ApiController] public class AuthenticationController : ControllerBase { private readonly IConfiguration _configuration; public AuthenticationController(IConfiguration configuration) { _configuration = configuration; } [HttpPost] public ActionResult RequestToken(string name, string password) { if (name == null && password == null) return BadRequest("Invalid Request"); var tokenParameter = _configuration.GetSection("tokenParameter").Get<TokenParameter>(); var claims = new Claim[] { new Claim(ClaimTypes.Name,name), new Claim(ClaimTypes.Role,"Root"), }; var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(tokenParameter.Secret)); var token = new JwtSecurityToken( issuer: tokenParameter.Issuer, audience: tokenParameter.Audience, claims: claims, notBefore: DateTime.Now, expires: DateTime.Now.AddMinutes(tokenParameter.AccessExpiration), signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)); //生成Token string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); return Ok(jwtToken); } }
測試:
先直接調用WeatherForecast/Get方法,會返回結果401錯誤,然后調用/Authentication/RequestToken方法,獲取token:
點擊swagger文檔右上角:Authorize
輸入:Bearer {token}(注意兩者之間是一個空格) :
再次測試WeatherForecast/Get方法: