asp.net core如何實(shí)現(xiàn)身份驗(yàn)證

小樊
82
2024-11-15 02:05:46

在ASP.NET Core中實(shí)現(xiàn)身份驗(yàn)證,通常需要以下幾個(gè)步驟:

  1. 添加相關(guān)包:首先,你需要在項(xiàng)目中添加相關(guān)的包。對(duì)于身份驗(yàn)證,你需要安裝以下包:

    • Microsoft.AspNetCore.Identity.EntityFrameworkCore:用于在Entity Framework Core中實(shí)現(xiàn)用戶和角色管理。
    • Microsoft.AspNetCore.Authentication.JwtBearer:用于實(shí)現(xiàn)JWT(JSON Web Token)身份驗(yàn)證。
    • Microsoft.AspNetCore.Authorization:用于實(shí)現(xiàn)授權(quán)策略。

    在項(xiàng)目中使用NuGet包管理器安裝這些包,或者在.csproj文件中添加以下依賴項(xiàng):

    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authorization" Version="5.0.0" />
    
  2. 創(chuàng)建用戶和角色模型:接下來(lái),你需要?jiǎng)?chuàng)建用戶和角色模型。這些模型通常繼承自IdentityUserIdentityRole類。例如:

    public class ApplicationUser : IdentityUser
    {
        // 添加其他自定義屬性
    }
    
    public class ApplicationRole : IdentityRole
    {
        // 添加其他自定義屬性
    }
    
  3. 配置Identity:在Startup.cs文件中,你需要配置Identity服務(wù)。首先,添加IdentityServiceConfigureServices方法中:

    services.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
    

    然后,在Configure方法中,添加Identity中間件:

    app.UseAuthentication();
    app.UseAuthorization();
    
  4. 創(chuàng)建數(shù)據(jù)庫(kù)上下文:創(chuàng)建一個(gè)繼承自IdentityDbContext的類,用于連接數(shù)據(jù)庫(kù)。例如:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }
    
  5. 配置數(shù)據(jù)庫(kù)連接:在appsettings.json文件中,添加數(shù)據(jù)庫(kù)連接字符串。例如,如果你使用的是SQL Server:

    "ConnectionStrings": {
      "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
    
  6. 遷移數(shù)據(jù)庫(kù):在包管理器控制臺(tái)中,運(yùn)行以下命令以創(chuàng)建數(shù)據(jù)庫(kù)表:

    dotnet ef migrations add InitialCreate
    dotnet ef database update
    
  7. 實(shí)現(xiàn)登錄和注冊(cè):創(chuàng)建控制器和視圖,以實(shí)現(xiàn)用戶登錄和注冊(cè)功能。使用[Authorize]屬性保護(hù)需要身份驗(yàn)證的控制器方法。例如:

    [Authorize]
    public class AccountController : Controller
    {
        // 登錄和注冊(cè)方法
    }
    
  8. 實(shí)現(xiàn)JWT身份驗(yàn)證:創(chuàng)建一個(gè)繼承自JwtBearerOptions的類,用于配置JWT身份驗(yàn)證。例如:

    public class JwtOptions : JwtBearerOptions
    {
        public string Secret { get; set; }
        public string Issuer { get; set; }
        public string Audience { get; set; }
    }
    

    Startup.cs文件中,將JwtOptions添加到ConfigureServices方法中,并配置JwtBearer中間件:

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer<JwtOptions>(options =>
    {
        options.RequireHttpsMetadata = true;
        options.SaveToken = true;
    });
    

    Configure方法中,添加JwtBearer中間件:

    app.UseAuthentication();
    app.UseAuthorization();
    
  9. 生成和驗(yàn)證JWT令牌:創(chuàng)建一個(gè)控制器方法,用于生成JWT令牌。例如:

    [HttpPost("login")]
    public async Task<IActionResult> Login([FromBody] LoginViewModel model)
    {
        // 驗(yàn)證用戶憑據(jù)
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, false, lockoutOnFailure: true);
    
        if (result.Succeeded)
        {
            var user = await _userManager.GetUserAsync(model.Email);
            var claims = new[]
            {
                new Claim(ClaimTypes.NameIdentifier, user.Id),
                new Claim(ClaimTypes.Name, user.UserName)
            };
    
            var token = new JwtSecurityToken(
                issuer: Configuration["Jwt:Issuer"],
                audience: Configuration["Jwt:Audience"],
                claims: claims,
                expires: DateTime.UtcNow.AddMinutes(30),
                signingCredentials: new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Secret"])));
    
            return Ok(new { token });
        }
    
        return Unauthorized();
    }
    

    在需要驗(yàn)證JWT令牌的控制器方法上添加[Authorize]屬性。例如:

    [Authorize]
    public class ProtectedController : Controller
    {
        // 受保護(hù)的方法
    }
    

通過(guò)以上步驟,你可以在ASP.NET Core中實(shí)現(xiàn)身份驗(yàn)證。請(qǐng)注意,這只是一個(gè)簡(jiǎn)單的示例,實(shí)際項(xiàng)目中可能需要根據(jù)需求進(jìn)行更多的定制和優(yōu)化。

0