Google Code Prettify

SignInManager 類已經過時了要如何替換?

如果 `SignInManager<TUser>` 類在 ASP.NET Core 8 中已經過時或不建議使用,你可以考慮使用其他方式來實現身份驗證功能。通常,你可以直接使用身份驗證中間件和自定義的身份驗證處理程序來替代。


以下是使用 ASP.NET Core 8 中內置的身份驗證和授權中間件來實現身份驗證的步驟:


1. **配置身份驗證服務**:

   在 `Program.cs` 文件中配置身份驗證服務。這裡我們將使用 JWT(JSON Web Token)作為示例。


   ```csharp

   using Microsoft.AspNetCore.Authentication.JwtBearer;

   using Microsoft.IdentityModel.Tokens;

   using System.Text;


   var builder = WebApplication.CreateBuilder(args);


   // 添加服務到容器

   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,

           ValidIssuer = "yourissuer",

           ValidAudience = "youraudience",

           IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yoursecretkey"))

       };

   });


   builder.Services.AddAuthorization();


   var app = builder.Build();


   // 配置 HTTP 請求管道

   app.UseAuthentication();

   app.UseAuthorization();


   app.MapControllers();


   app.Run();

   ```


2. **創建用戶登入的 API**:

   創建一個控制器來處理用戶登入並生成 JWT。


   ```csharp

   using Microsoft.AspNetCore.Mvc;

   using Microsoft.IdentityModel.Tokens;

   using System.IdentityModel.Tokens.Jwt;

   using System.Security.Claims;

   using System.Text;


   [Route("api/[controller]")]

   [ApiController]

   public class AuthController : ControllerBase

   {

       [HttpPost("login")]

       public IActionResult Login([FromBody] LoginModel model)

       {

           // 假設我們已經驗證了用戶名和密碼

           // 這裡僅作為示例,請根據你的需要進行修改

           if (model.Username == "test" && model.Password == "password")

           {

               var tokenHandler = new JwtSecurityTokenHandler();

               var key = Encoding.UTF8.GetBytes("yoursecretkey");

               var tokenDescriptor = new SecurityTokenDescriptor

               {

                   Subject = new ClaimsIdentity(new[]

                   {

                       new Claim(ClaimTypes.Name, model.Username)

                   }),

                   Expires = DateTime.UtcNow.AddHours(1),

                   SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),

                   Issuer = "yourissuer",

                   Audience = "youraudience"

               };


               var token = tokenHandler.CreateToken(tokenDescriptor);

               var tokenString = tokenHandler.WriteToken(token);


               return Ok(new { Token = tokenString });

           }


           return Unauthorized();

       }

   }


   public class LoginModel

   {

       public string Username { get; set; }

       public string Password { get; set; }

   }

   ```


3. **受保護的 API**:

   創建一個受保護的 API,只有經過身份驗證的用戶才能訪問。


   ```csharp

   [Authorize]

   [Route("api/[controller]")]

   [ApiController]

   public class ProtectedController : ControllerBase

   {

       [HttpGet]

       public IActionResult Get()

       {

           return Ok("This is a protected resource");

       }

   }

   ```


4. **啟動應用**:

   確保你的應用已經正確配置並啟動。當用戶進行登入時,會獲取一個 JWT,這個 token 需要在後續請求中作為 Bearer token 進行傳遞,從而訪問受保護的資源。


通過這種方式,你可以不依賴於 `SignInManager<TUser>` 類,使用標準的 JWT 身份驗證來管理用戶的登入和授權。這種方法靈活且容易擴展,適用於多種應用場景。