asp.net core使用identity+jwt保護你的webapi(一)——identity基礎配置

xhznl發表於2021-09-28

前言

使用者模組幾乎是每個系統必備的基礎功能,如果每次開發一個新專案時都要做個使用者模組,確實非常無聊。好在asp.net core給我們提供了Identity,使用起來也是比較方便,如果對使用者這塊需求不是非常個性化的話,identity是一個不錯的選擇。

ASP.NET Core Identity:

  • 是一個 API,它支援使用者 登入功能(UI介面) 。

  • 管理使用者、密碼、配置檔案資料、角色、宣告、令牌、電子郵件確認等。

Web API中整合Identity

identity是支援UI介面的,如果不是前後端分離專案,可以直接整合identity UI模組,因為我這裡使用Web API,就忽略掉identity UI部分。

安裝相關包

下面介紹以最小化方式引入identity。

首先建立一個Web API空專案,NuGet安裝identity、efcore、jwt相關包,資料庫我這裡就使用Sqlite:

<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.10" />

自定義User,Context

建立自己的User實體,繼承IdentityUserIdentityUser中已經有一些基礎欄位,你可以在你的AppUser中額外定義一些自己需要的欄位,比如Address

public class AppUser : IdentityUser
{
    [Required] 
    [StringLength(128)] 
    public string Address { get; set; }
}

建立自己的DbContext,繼承IdentityDbContext<>,泛型傳入自己的AppUser

public class AppDbContext : IdentityDbContext<AppUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options)
    {
    }
}

在Startup中配置服務:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddDbContext<AppDbContext>(options =>
        options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
    
    services.AddIdentityCore<AppUser>().AddEntityFrameworkStores<AppDbContext>();
}

appsettings.json:

"ConnectionStrings": {
  "DefaultConnection": "DataSource=app.db; Cache=Shared"
}

這樣一個最簡單的自定義配置就完成了。

資料庫遷移

使用dotnet ef命令遷移:

dotnet ef migrations add AppDbContext_Initial

dotnet ef database update

執行完成後已經生成了identity相關表:

image-20210927210147461

修改主鍵型別/表名

identity使用者,角色表的主鍵預設型別是string,預設值是Guid.NewGuid().ToString(),資料量不大時無所謂,否則可能存在效能問題。identity支援主鍵型別的修改;想要修改表名,修改欄位長度等等,也是非常容易:

public class AppUser : IdentityUser<int>
{
    [Required] 
    [StringLength(128)] 
    public string Address { get; set; }
}
public class AppDbContext : IdentityDbContext<AppUser, IdentityRole<int>, int>
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        
        builder.Entity<AppUser>(b => { b.ToTable("AppUsers"); });
        builder.Entity<IdentityUserClaim<int>>(b => { b.ToTable("AppUserClaims"); });
        builder.Entity<IdentityUserLogin<int>>(b => { b.ToTable("AppUserLogins"); });
        builder.Entity<IdentityUserToken<int>>(b => { b.ToTable("AppUserTokens"); });
        builder.Entity<IdentityRole<int>>(b => { b.ToTable("AppRoles"); });
        builder.Entity<IdentityRoleClaim<int>>(b => { b.ToTable("AppRoleClaims"); });
        builder.Entity<IdentityUserRole<int>>(b => { b.ToTable("AppUserRoles"); });
    }
}

修改完成後更新資料庫:

dotnet ef migrations add AppDbContext_Modify_PK_Type

dotnet ef database update

檢視主鍵,表名已成功修改:

image-20210927212546938

最後

本篇完成了identity的基本配置,下一篇將介紹如何使用identity完成使用者註冊登入,以及獲取jwt token。

參考:

ASP.NET Core 簡介 Identity | Microsoft Docs

Mohamad Lawand - DEV Community

相關文章