.Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API

yizhihongxing

.Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API

IdentityServer4是一个开源的身份验证和授权框架,它可以帮助我们轻松地实现单点登录和API访问控制。AspNetCore Identity是一个用于管理用户和角色的框架,它可以与IdentityServer4集成,实现用户身份验证和授权管理。本文将介绍如何使用.Net6集成IdentityServer4和AspNetCore Identity,读取数据表用户并实现鉴权授权管理API。

步骤一:创建新项目

首先,我们需要创建一个新的.Net6 Web API项目。在Visual Studio中,选择“创建新项目”,然后选择“ASP.NET Core Web应用程序”。在下一个屏幕上,选择“API”模板,并确保选择“ASP.NET Core 6.0”作为目标框架。

步骤二:安装依赖

我们需要安装以下NuGet包:

  • IdentityServer4
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer

您可以使用NuGet包管理器或命令行来安装这些包。

步骤三:配置IdentityServer4

在Startup.cs文件中,我们需要配置IdentityServer4。首先,我们需要添加以下命名空间:

using IdentityServer4;
using IdentityServer4.Models;
using IdentityServer4.Test;

然后,我们需要添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    // 添加IdentityServer4服务
    services.AddIdentityServer()
        .AddInMemoryClients(new[] {
            new Client {
                ClientId = "client",
                AllowedGrantTypes = GrantTypes.ClientCredentials,
                ClientSecrets = { new Secret("secret".Sha256()) },
                AllowedScopes = { "api1" }
            }
        })
        .AddInMemoryApiScopes(new[] {
            new ApiScope("api1", "My API")
        })
        .AddInMemoryApiResources(new[] {
            new ApiResource("api1", "My API")
            {
                Scopes = { "api1" }
            }
        })
        .AddTestUsers(new[] {
            new TestUser {
                SubjectId = "1",
                Username = "alice",
                Password = "password"
            }
        })
        .AddDeveloperSigningCredential();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 配置IdentityServer4中间件
    app.UseIdentityServer();
}

在上面的代码中,我们首先添加了IdentityServer4服务,并配置了一个客户端、一个API资源和一个API范围。然后,我们添加了一个测试用户,并使用开发人员签名凭据进行签名。最后,我们配置了IdentityServer4中间件。

步骤四:配置AspNetCore Identity

在Startup.cs文件中,我们还需要配置AspNetCore Identity。首先,我们需要添加以下命名空间:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;

然后,我们需要添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    // 添加AspNetCore Identity服务
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

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

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 配置AspNetCore Identity中间件
    app.UseAuthentication();
    app.UseAuthorization();
}

在上面的代码中,我们首先添加了AspNetCore Identity服务,并配置了一个DbContext和一个用户存储库。然后,我们配置了AspNetCore Identity中间件。

步骤五:创建数据表

我们需要创建一个名为“AspNetUsers”的数据表,用于存储用户信息。您可以使用以下SQL脚本创建该表:

CREATE TABLE [dbo].[AspNetUsers](
    [Id] [nvarchar](450) NOT NULL,
    [UserName] [nvarchar](256) NULL,
    [NormalizedUserName] [nvarchar](256) NULL,
    [Email] [nvarchar](256) NULL,
    [NormalizedEmail] [nvarchar](256) NULL,
    [EmailConfirmed] [bit] NOT NULL,
    [PasswordHash] [nvarchar](max) NULL,
    [SecurityStamp] [nvarchar](max) NULL,
    [ConcurrencyStamp] [nvarchar](max) NULL,
    [PhoneNumber] [nvarchar](max) NULL,
    [PhoneNumberConfirmed] [bit] NOT NULL,
    [TwoFactorEnabled] [bit] NOT NULL,
    [LockoutEnd] [datetimeoffset](7) NULL,
    [LockoutEnabled] [bit] NOT NULL,
    [AccessFailedCount] [int] NOT NULL,
 CONSTRAINT [PK_AspNetUsers] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

步骤六:读取数据表用户

在Startup.cs文件中,我们需要添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    // 添加AspNetCore Identity服务
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

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

    // 配置IdentityServer4服务
    services.AddIdentityServer()
        .AddInMemoryClients(new[] {
            new Client {
                ClientId = "client",
                AllowedGrantTypes = GrantTypes.ClientCredentials,
                ClientSecrets = { new Secret("secret".Sha256()) },
                AllowedScopes = { "api1" }
            }
        })
        .AddInMemoryApiScopes(new[] {
            new ApiScope("api1", "My API")
        })
        .AddInMemoryApiResources(new[] {
            new ApiResource("api1", "My API")
            {
                Scopes = { "api1" }
            }
        })
        .AddTestUsers(new[] {
            new TestUser {
                SubjectId = "1",
                Username = "alice",
                Password = "password"
            }
        })
        .AddDeveloperSigningCredential();

    // 添加授权策略
    services.AddAuthorization(options =>
    {
        options.AddPolicy("ApiScope", policy =>
        {
            policy.RequireAuthenticatedUser();
            policy.RequireClaim("scope", "api1");
        });
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 配置AspNetCore Identity中间件
    app.UseAuthentication();
    app.UseAuthorization();

    // 配置IdentityServer4中间件
    app.UseIdentityServer();

    // 配置API路由
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers()
            .RequireAuthorization("ApiScope");
    });
}

在上面的代码中,我们首先添加了授权策略,要求用户必须经过身份验证并具有“api1”范围的声明。然后,我们配置了API路由,并要求所有API端点都需要“ApiScope”策略的授权。

接下来,我们需要创建一个名为“ApplicationUser”的类,用于表示AspNetCore Identity用户。该类应该继承IdentityUser类,并添加任何其他属性,例如“FullName”:

public class ApplicationUser : IdentityUser
{
    public string FullName { get; set; }
}

然后,我们需要创建一个名为“ApplicationDbContext”的类,用于表示AspNetCore Identity上下文。该类应该继承IdentityDbContext类,并添加任何其他DbSet,例如“Products”:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<Product> Products { get; set; }
}

最后,我们需要创建一个名为“UserController”的控制器,用于处理用户相关的API请求。该控制器应该包含以下代码:

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    private readonly UserManager<ApplicationUser> _userManager;

    public UserController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetUser(string id)
    {
        var user = await _userManager.FindByIdAsync(id);

        if (user == null)
        {
            return NotFound();
        }

        return Ok(user);
    }
}

在上面的代码中,我们首先注入了UserManager服务,用于管理AspNetCore Identity用户。然后,我们创建了一个名为“GetUser”的API端点,用于获取指定ID的用户。该端点首先使用UserManager服务查找用户,然后返回用户信息或404错误。

示例一:使用Postman测试API

我们可以使用Postman测试API。首先,我们需要获取访问令牌。打开Postman,选择“POST”请求,然后输入以下URL:

https://localhost:5001/connect/token

在“Body”选项卡中,选择“x-www-form-urlencoded”选项,并添加以下键值对:

  • grant_type:client_credentials
  • client_id:client
  • client_secret:secret
  • scope:api1

然后,单击“发送”按钮,您将收到一个访问令牌。将该令牌复制到剪贴板中。

接下来,我们可以使用该令牌调用API端点。打开Postman,选择“GET”请求,然后输入以下URL:

https://localhost:5001/user/1

在“Headers”选项卡中,添加以下键值对:

  • Authorization:Bearer [访问令牌]

然后,单击“发送”按钮,您将收到用户信息或404错误。

示例二:使用HttpClient测试API

我们还可以使用HttpClient测试API。首先,我们需要获取访问令牌。在Startup.cs文件中,我们可以添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    // 添加HttpClient服务
    services.AddHttpClient("api", client =>
    {
        client.BaseAddress = new Uri("https://localhost:5001");
        client.DefaultRequestHeaders.Add("Accept", "application/json");
    });

    // ...
}

然后,我们可以在控制器中注入IHttpClientFactory服务,并使用它来调用API端点:

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly IHttpClientFactory _httpClientFactory;

    public UserController(UserManager<ApplicationUser> userManager, IHttpClientFactory httpClientFactory)
    {
        _userManager = userManager;
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetUser(string id)
    {
        var user = await _userManager.FindByIdAsync(id);

        if (user == null)
        {
            return NotFound();
        }

        var client = _httpClientFactory.CreateClient("api");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", HttpContext.Request.Headers["Authorization"].ToString().Replace("Bearer ", ""));

        var response = await client.GetAsync($"/user/{id}");

        if (!response.IsSuccessStatusCode)
        {
            return NotFound();
        }

        var content = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<ApplicationUser>(content);

        return Ok(result);
    }
}

在上面的代码中,我们首先注入了IHttpClientFactory服务,用于创建HttpClient实例。然后,我们创建了一个名为“GetUser”的API端点,用于获取指定ID的用户。该端点首先使用UserManager服务查找用户,然后使用IHttpClientFactory服务调用API端点。如果API端点返回成功响应,我们将反序列化响应内容并返回用户信息。否则,我们将返回404错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C# Linq的Skip()方法 – 跳过序列中指定数量的元素并返回剩余元素

    当使用LINQ(C# language integrated query)对集合进行查询时,我们经常需要对查询结果进行排序、筛选、分组和投影等操作。而 Skip() 方法是其中一个很有用的操作之一。 一、Skip()方法的概述 Skip() 方法是用来跳过指定数量的元素并返回剩余元素的 LINQ 方法。Skip() 方法跳过序列中的从头开始的指定数量的元素,…

    C# 2023年4月19日
    00
  • C#更新SQLServer中TimeStamp字段(时间戳)的方法

    一、概述 TimeStamp字段也叫RowVersion字段,它的存储空间为8个字节,用来表示某一条记录的版本号,取值范围在datetime2类型的范围内,但它不是一个日期时间字段,也不是一个自增长字段,是Sql Server自有的一种数据类型。 在更新数据库表的时候,我们经常要更新TimeStamp字段,下面是C#更新SQLServer中TimeStamp…

    C# 2023年5月31日
    00
  • asp.net GridView排序简单实现

    下面我将为你详细讲解“asp.net GridView排序简单实现”的完整攻略。 一、前置知识 在讲解排序实现前,我们需要先了解GridView控件的使用方法: 1. GridView的基本用法 GridView是asp.net中的一个非常常用的控件,一般用于展示数据表格。使用GridView控件展示数据非常方便。GridView控件有如下几个主要的属性: …

    C# 2023年5月31日
    00
  • 聊聊Unity 自定义日志保存的问题

    针对“聊聊Unity自定义日志保存的问题”,我可以提供以下完整攻略: 1. 了解Unity自带的日志系统 Unity自己的日志系统提供了五个级别的日志输出,分别是:Log、Warning、Error、Assert和Exception。日志输出的级别可以通过Debug.unityLogger.filterLogType属性来控制。我们可以通过在代码中使用Deb…

    C# 2023年5月15日
    00
  • C#中按引用传递与按值传递的区别,以及ref与out关键字的用法详解

    C#中按引用传递与按值传递的区别 在C#中,方法参数可以按值传递或按引用传递。按值传递会将参数的实际值复制到方法中,而按引用传递则会将参数的引用(地址)复制到方法中。这两种传递方式的区别在于方法中对于参数的操作会不会影响到方法外部的参数值。 按值传递 按值传递的实参对应的是形式参数,两者是完全独立的。也就是说,方法内对参数的修改不会对方法外部的参数造成影响。…

    C# 2023年6月7日
    00
  • Visual C#中如何使用IComparable和IComparer接口

    Visual C# 中使用 IComparable 和 IComparer 接口的主要作用是用于比较数据类型之间的差异,比如对象是否相等等。这两个接口都是用于排序数据类型的,IComparable 是接口用于实现单个数据类型的排序,IComparer 适用于实现对多个数据类型的排序。以下是在 Visual C# 中使用这两个接口的方法: 使用 ICompar…

    C# 2023年6月6日
    00
  • C# 获取动态key的json对象的值案例

    下面我来详细讲解一下“C# 获取动态key的json对象的值案例”的完整攻略。 1.前言 在C#开发过程中,我们经常需要从json数据中获取特定的值。但是在实际开发中,json数据中包含的key是动态的,无法提前确定。这时我们需要一种能够灵活处理动态key的方法。 2.解决方案 2.1 使用Newtonsoft.Json库 我们可以使用Newtonsoft.…

    C# 2023年5月31日
    00
  • C#简单读取主机上所有进程的方法

    C#简单读取主机上所有进程的方法 在C#中,我们可以使用System.Diagnostics.Process类来读取主机上所有的进程。Process类提供了获取所有正在运行的进程,以及根据名称、PID等条件筛选进程的方法。 下面详细介绍如何使用Process类来读取主机上所有进程。 1. 获取所有正在运行的进程 可以使用Process类的静态方法Proces…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部