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

相关文章

  • WPF+ASP.NET SignalR实现简易在线聊天功能的示例代码

    下面是关于“WPF+ASP.NET SignalR实现简易在线聊天功能的示例代码”的完整攻略。 WPF+ASP.NET SignalR实现简易在线聊天功能 1. 简介 本文旨在讲解如何使用WPF和ASP.NET SignalR实现简易在线聊天功能,供初学者参考。 2. 准备 在开始之前,需要进行一些准备工作: .NET框架:确保本地已经安装了.NET框架 V…

    C# 2023年5月31日
    00
  • asp.net中Fine Uploader文件上传组件使用介绍

    下面是关于“asp.net中Fine Uploader文件上传组件使用介绍”的完整攻略。 Fine Uploader是什么? Fine Uploader是一个基于JavaScript的文件上传库,它支持大文件上传、断点续传、浏览器兼容性好等特性。Fine Uploader可以通过原生的XHR2(XMLHttpRequest Level 2)实现文件上传,在服…

    C# 2023年6月1日
    00
  • C# URL短地址压缩算法及短网址原理解析

    下面是 “C# URL短地址压缩算法及短网址原理解析” 的完整攻略。 短网址原理解析 短网址,也称为短链接,是一种将网址进行短化以达到方便记忆和分享的方式。短网址一般由原始的URL地址经过一系列的转换算法生成,使其在不失去其唯一性的前提下更短。短网址的原理一般涉及通用字符编码、过程加盐、自增长等技术。 C# URL短地址压缩算法 下面是一种常见的URL短地址…

    C# 2023年6月8日
    00
  • C#利用ODP.net连接Oracle数据库的操作方法

    C#利用ODP.net连接Oracle数据库的操作方法 简介 Oracle Data Provider for .NET(简称ODP.net)是Oracle公司自己提供的一种开发工具,ODP.net 是用于 .NET Framework 的 Oracle 数据提供程序,支持数据访问和数据源包装。 使用 ODP.net 需要在客户端安装 Oracle 数据库。…

    C# 2023年6月2日
    00
  • CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南(1)

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。它支持:.NET Standard 2.0、 .…

    C# 2023年4月18日
    00
  • C#中abstract的用法详解

    C#中abstract的用法详解 简介 abstract 是C#中一个重要的关键字,表示抽象,它用于定义抽象类或抽象方法,是实现面向对象中重要的机制。一个抽象类不能被直接实例化,而只能作为基类被其他类继承。从抽象类继承的子类,必须实现该抽象类中的abstract方法,才能被实例化。在C#中,抽象类和抽象方法通常用于建立基础类和组件,使代码具有更强的可重用性。…

    C# 2023年5月15日
    00
  • 如何在ASP.Net Core使用分布式缓存的实现

    如何在ASP.Net Core使用分布式缓存的实现攻略 在本攻略中,我们将详细讲解如何在ASP.Net Core应用程序中使用分布式缓存,并提供两个示例说明。 步骤一:安装NuGet包 在ASP.Net Core应用程序中使用分布式缓存,您需要安装Microsoft.Extensions.Caching.StackExchangeRedis NuGet包。您…

    C# 2023年5月17日
    00
  • C# 实现WebSocket服务端教程

    针对“C# 实现WebSocket服务端教程”,我将提供完整的攻略。下面是详细的步骤: 步骤一:创建一个空的C#控制台应用程序 可以使用Visual Studio进行创建,也可以使用命令行创建,此处不再赘述。在创建时,需要选择.NET Core 3.x或者.NET 5+作为Target Framework。 步骤二:添加NuGet包 在控制台中输入以下命令,…

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