📜  .net 核心身份获取用户 ID - C# (1)

📅  最后修改于: 2023-12-03 15:13:04.169000             🧑  作者: Mango

.NET Core身份认证获取用户ID - 使用C#

在web应用程序中,一般都会需要对用户进行身份认证,以便在服务器端识别用户,从而保证安全性和权限控制。在.NET Core中,我们可以使用Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authentication.JwtBearer组件来实现身份认证,并通过Claims记录用户信息,其中包括用户ID。

本文将介绍如何使用C#在.NET Core应用程序中获取通过身份认证系统认证的用户ID。

1. 添加身份认证组件依赖项

首先,我们需要在.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命令安装所需的组件。

2. 添加身份认证配置到启动文件Startup.cs

我们需要在应用程序的启动文件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参数配置为应用程序可能签发的值。

3. 在身份认证控制器中获取用户ID

现在我们已经配置好了身份认证,可以开始在控制器中获取用户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。