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