📅  最后修改于: 2023-12-03 15:13:04.169000             🧑  作者: Mango
在web应用程序中,一般都会需要对用户进行身份认证,以便在服务器端识别用户,从而保证安全性和权限控制。在.NET Core中,我们可以使用Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authentication.JwtBearer组件来实现身份认证,并通过Claims记录用户信息,其中包括用户ID。
本文将介绍如何使用C#在.NET Core应用程序中获取通过身份认证系统认证的用户ID。
首先,我们需要在.NET Core项目中添加身份认证组件依赖项。我们需要在项目的.csproj文件中添加以下代码,如下所示:
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="2.2.0" />
</ItemGroup>
然后运行dotnet restore
命令安装所需的组件。
我们需要在应用程序的启动文件Startup.cs中添加身份认证配置。我们可以在ConfigureServices()方法中添加以下代码,如下所示:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
public void ConfigureServices(IServiceCollection services)
{
//配置JWT授权验证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "http://localhost:5000",
ValidAudience = "http://localhost:5000",
IssuerSigningKey = SymmetricSecurityKey.DecodeBase64String("your_secret_key_here")
};
});
}
在这里,我们使用AddJwtBearer()方法来添加JWT身份认证配置,指定了TokenValidationParameters用于控制验证逻辑,其中包含如何验证Issuer、Audience、Lifetime和SigningKey的设置。我们需要将ValidIssuer、ValidAudience和IssuerSigningKey参数配置为应用程序可能签发的值。
现在我们已经配置好了身份认证,可以开始在控制器中获取用户ID。在控制器中,我们可以通过User.Identity.Name属性来获取身份认证系统返回的用户名,然后从用户名中解析出用户ID。假设我们在Jwt Token的Subject中包含了用户ID信息:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Security.Claims;
[Authorize]
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
// GET: /user/id
[HttpGet("id")]
public ActionResult<int> GetUserId()
{
var userIdClaim = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
var userId = int.Parse(userIdClaim.Value);
return userId;
}
else
{
return NotFound();
}
}
}
在这里,我们使用[Authorize]属性来指定该控制器必须进行身份认证才能访问。然后在GetUserId()方法中,我们使用User.Claims属性来获取所有关于用户的Claims信息,然后从中查找包含用户ID的Claim,并将其解析为整数型返回。
还需要注意的是,如果我们使用不同的Claim类型来存储用户ID,则需要修改User.Claims.FirstOrDefault()中的条件表达式,以便正确地获取用户ID。
至此,我们已经学习了如何在.NET Core应用程序中获取经过身份认证系统认证的用户ID。