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

.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日

相关文章

  • 如何在.Net 7中将Query绑定到数组详解

    以下是关于“如何在 .NET 7 中将 Query 绑定到数组”的完整攻略: 1. 问题描述 在 .NET 7 中,我们经常需要将 Query 绑定到数组。但是,由 .NET 7 中的一些更改,可能会导致以前的方法不再适用。因此,我们需要了解如何在 .NET 7 中将 Query 绑定到数组。 2. 解决方案 要将 Query 绑定到数组,可以使用以下步骤:…

    C# 2023年5月12日
    00
  • c# 委托的常见用法

    c# 委托的常见用法 委托的基本概念 C#中,委托是一个类,它允许将方法作为参数传递给另一个方法,或者将方法存储在字段或属性中,以便稍后调用。委托是一种语言结构,它允许我们使代码更加模块化,并提高代码的可读性。 委托的声明 使用一个 delegate 关键字即可声明一个委托类型,委托类的名称有一定规范,通常以 Func 或 Action 开头,后接参数和返回…

    C# 2023年6月7日
    00
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    判断一个字符串是否是数字或者是否包含某个数字是开发过程中常见的需求。在C#中,可以使用正则表达式、Char.IsDigit()方法和int.TryParse()方法等实现这个功能。 方法一:使用正则表达式 可以使用正则表达式来验证一个字符串是否为纯数字或者是否包含某个数字。一个纯数字的字符串由一个或多个数字字符组成,如”123456″。一个包含某个数字的字符…

    C# 2023年6月8日
    00
  • C#使用Datatable导出Excel

    Sure,以下是详细讲解”C#使用DataTable导出Excel”的完整攻略。 1. 准备工作 在开始实现功能之前需要先添加引用,右键点击项目,选择“添加”→“引用”,然后在出现的对话框中找到“Microsoft.Office.Interop.Excel”并添加引用。还需要在文件头部添加命名空间: using System.Data; using Micr…

    C# 2023年5月31日
    00
  • ASP.NET Core如何添加统一模型验证处理机制详解

    ASP.NET Core如何添加统一模型验证处理机制详解 在本攻略中,我们将详细讲解如何在ASP.NET Core中添加统一模型验证处理机制,以确保应用程序中的模型验证能够得到正确处理。我们将提供两个示例说明。 什么是模型验证 在ASP.NET Core中,模型验证是指对应用程序中的模型进行验证的过程。模型验证通常用于确保应用程序中的数据符合特定的规则和要求…

    C# 2023年5月16日
    00
  • .NET Core分布式链路追踪框架的基本实现原理

    .NET Core分布式链路追踪框架的基本实现原理 分布式链路追踪是一种用于跟踪分布式系统中请求的技术。在.NET Core中,我们可以使用分布式链路追踪框架来跟踪请求的流程和性能。本攻略将详细介绍.NET Core分布式链路追踪框架的基本实现原理,并提供两个示例说明。 基本实现原理 .NET Core分布式链路追踪框架的基本实现原理如下: 在分布式系统中,…

    C# 2023年5月17日
    00
  • C#实现简单超市收银系统

    C#实现简单超市收银系统攻略 本攻略将会让您学习如何使用C#编写一个简单的超市收银系统。这个系统可以进行基本的商品库存管理和结算功能,包含了商品添加、修改、查询和删除功能。此外,当用户选购完商品后,系统会对商品进行结算并输出购物清单和价格信息。 1. 搭建环境 在开始编写代码之前,我们需要先搭建好我们的编程环境,需要准备以下工具: Visual Studio…

    C# 2023年6月6日
    00
  • 详解C#中通过委托来实现回调函数功能的方法

    详解C#中通过委托来实现回调函数功能的方法: 1.委托和回调函数的概念 在C#中,委托(Delegate)是一种类型,它是一种指向方法的引用,可以将方法作为参数传递。回调函数(Callback Function)是一种方法,它可以作为参数传递给其他方法,然后在适当的时候被调用。 2.使用委托实现回调函数 在C#中,可以使用委托来实现回调函数的功能。首先定义一…

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