前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用identity+jwt保护你的webapi(一)——identity基础配置

使用identity+jwt保护你的webapi(一)——identity基础配置

作者头像
xhznl
发布2021-10-18 18:06:15
1.8K0
发布2021-10-18 18:06:15
举报
文章被收录于专栏:小黑在哪里小黑在哪里

前言

用户模块几乎是每个系统必备的基础功能,如果每次开发一个新项目时都要做个用户模块,确实非常无聊。好在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:

代码语言:javascript
复制
<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

代码语言:javascript
复制
public class AppUser : IdentityUser
{
    [Required] 
    [StringLength(128)] 
    public string Address { get; set; }
}

创建自己的DbContext,继承IdentityDbContext<>,泛型传入自己的AppUser

代码语言:javascript
复制
public class AppDbContext : IdentityDbContext<AppUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options)
    {
    }
}

在Startup中配置服务:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

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

appsettings.json:

代码语言:javascript
复制
"ConnectionStrings": {
  "DefaultConnection": "DataSource=app.db; Cache=Shared"
}

这样一个最简单的自定义配置就完成了。

数据库迁移

使用dotnet ef命令迁移:

代码语言:javascript
复制
dotnet ef migrations add AppDbContext_Initial

dotnet ef database update

执行完成后已经生成了identity相关表:

修改主键类型/表名

identity用户,角色表的主键默认类型是string,默认值是Guid.NewGuid().ToString(),数据量不大时无所谓,否则可能存在性能问题。identity支持主键类型的修改;想要修改表名,修改字段长度等等,也是非常容易:

代码语言:javascript
复制
public class AppUser : IdentityUser<int>
{
    [Required] 
    [StringLength(128)] 
    public string Address { get; set; }
}
代码语言:javascript
复制
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"); });
    }
}

修改完成后更新数据库:

代码语言:javascript
复制
dotnet ef migrations add AppDbContext_Modify_PK_Type

dotnet ef database update

查看主键,表名已成功修改:

最后

本篇完成了identity的基本配置,下一篇将介绍如何使用identity完成用户注册登录,以及获取jwt token。

参考: ASP.NET Core 简介 Identity | Microsoft Docs[1] Mohamad Lawand - DEV Community[2]

参考资料

[1]

ASP.NET Core 简介 Identity | Microsoft Docs: https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/identity?view=aspnetcore-5.0&tabs=visual-studio

[2]

Mohamad Lawand - DEV Community: https://dev.to/moe23/comments

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小黑在哪里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Web API中集成Identity
    • 安装相关包
      • 自定义User,Context
        • 数据库迁移
          • 修改主键类型/表名
            • 参考资料
        • 最后
        相关产品与服务
        数据传输服务
        腾讯云数据传输服务(Data Transfer Service,DTS)可帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库多活架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。同时,DTS 还提供私有化独立输出版本 DTS-DBbridge,支持异构数据库和同构数据库之间迁移和同步,可以帮助企业实现完整数据库迁移(如 Oracle)。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档