ASP.NET CORE 3.1 項目實戰一


一:使用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中的profileslaunchUrl:"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方法:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM