ASP.NET Web API 实现 Token 验证代码

发布时间 2023-03-22 22:33:05作者: 仲夏不凉爽
public class TokenController : ApiController // 定义一个名为 TokenController 的类,继承自 ApiController 类。
{
    [HttpPost] // 使用 HTTP POST 请求方式。
    public HttpResponseMessage Login(User user) // 定义一个名为 Login 的方法,它接受一个 User 对象作为参数,并返回一个 HttpResponseMessage 对象。
    {
        if (user == null) // 如果 user 参数为空,则抛出一个 HTTP 响应异常(状态码为 400)。
        {
            throw new HttpResponseException(HttpStatusCode.BadRequest);
        }

        if (IsValid(user)) // 如果 IsValid 方法返回 true,则调用 TokenGenerator 类的 GenerateTokenJwt 方法生成一个 token,并将其作为 HTTP 响应正文返回给客户端。否则,返回一个 HTTP 响应异常(状态码为 401)。
        {
            var token = TokenGenerator.GenerateTokenJwt(user.Username);
            return Request.CreateResponse(HttpStatusCode.OK, token);
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid username or password.");
        }
    }

    private bool IsValid(User user) // IsValid 方法用于验证用户是否有效。在这个示例中,该方法始终返回 true。
    {
        // TODO: Check if the user is valid
        return true;
    }
}

public static class TokenGenerator // 定义一个名为 TokenGenerator 的静态类。
{
    public static string GenerateTokenJwt(string username) // 定义一个名为 GenerateTokenJwt 的静态方法,它接受一个字符串类型的参数 username,并返回一个字符串类型的 token。
    {
        var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes("your custom Security Key phrase")); // 创建一个 SymmetricSecurityKey 对象,它使用指定的字符串作为密钥。
        var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature); // 创建一个 SigningCredentials 对象,它使用指定的 SymmetricSecurityKey 对象和 HmacSha256Signature 签名算法。

        var claims = new[] // 创建一个 Claim 数组,
        {
            new Claim(JwtRegisteredClaimNames.Sub, username), // 包含用户名称的声明。
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), // 包含唯一标识符的声明。
        };

        var token = new JwtSecurityToken( // 创建一个 JwtSecurityToken 对象,它包含要包含在 token 中的声明、签名凭据和其他选项。
            issuer: "yourdomain.com", // 发行者名称。
            audience: "yourdomain.com", // 接收者名称。
            claims: claims, // 包含要包含在 token 中的声明的数组。
            expires: DateTime.UtcNow.AddDays(1), // token 的过期时间。
            signingCredentials: signingCredentials); // 用于签名 token 的凭据。

        return new JwtSecurityTokenHandler().WriteToken(token); // 将 JwtSecurityToken 对象转换为字符串类型的 token 并返回该字符串。
    }
}


这个示例代码使用了 JWT(JSON Web Token)来生成 token。在这个示例中,Web API 会在用户登录时生成一个 token 并将其返回给客户端。客户端可以将这个 token 存储在本地,并在每次请求时将其发送到 Web API。Web API 可以使用这个 token 来验证用户身份并返回相应的数据。