asp.netcore使用identity+jwt保护你的webapi(一)——ident。。。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
core使⽤identity+jwt保护你的webapi(⼀)——ident。
前⾔
⽤户模块⼏乎是每个系统必备的基础功能,如果每次开发⼀个新项⽬时都要做个⽤户模块,确实⾮常⽆聊。
好在 core给我们提供了Identity,使⽤起来也是⽐较⽅便,如果对⽤户这块需求不是⾮常个性化的话,identity是⼀个不错的选择。
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实体,继承IdentityUser,IdentityUser中已经有⼀些基础字段,你可以在你的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 =>
eSqlite(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相关表:
修改主键类型/表名
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
查看主键,表名已成功修改:
最后
本篇完成了identity的基本配置,下⼀篇将介绍如何使⽤identity完成⽤户注册登录,以及获取jwt token。
参考:。