关于jwt做登陆通过Response.HttpContext.User.Identity.Name获取jwt存的用户数据为null

在webapi中用jwt做身份验证的时候遇到的之前还好好的结果在做的时候一直通过Response.HttpContext.User.Identity.Name获取不到数据

目前已经找到解决方法如下:

登陆Controller

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;
using System.IdentityModel.Tokens.Jwt;
using System.Text;
using Microsoft.Extensions.Configuration;
using IConfiguration = Microsoft.Extensions.Configuration.IConfiguration;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc.Filters;
using Witworks.Presentation.ModuleSuite.ERPWebApi.Models;

namespace Witworks.Presentation.ModuleSuite.ERPWebApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LoginController : BaseController
    {
        private readonly IConfiguration _configuration;
        

        public LoginController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        [HttpPost]
        public IActionResult GetToken([FromBody] User user)
        {
            if (user.Name == "admin" && user.Password == "123456")
            {
                var name = user.Name+"";
                //颁发token
                //创建jwt
                //header
                var singingAlorithm = SecurityAlgorithms.HmacSha256;
                //payload(添加自定义内容)
                var claims = new List<Claim>();

                claims.AddRange(new[]{
                //        new Claim(ClaimTypes.Name,Id),
                sub     JwtRegisteredClaimNames.sub,用户id
                //new Claim(JwtRegisteredClaimNames.Sub,Id)
                        new Claim(ClaimTypes.Name, name),
                    new Claim(JwtRegisteredClaimNames.Sub, name),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                    new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64)
                        });


                //signiture 私钥
                var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
                var signingKey = new SymmetricSecurityKey(secretByte);
                var signingCredentials = new SigningCredentials(signingKey, singingAlorithm);

                var token = new JwtSecurityToken(
                   issuer: _configuration["Authentication:Issuer"],
                    audience: _configuration["Authentication:audience"],
                    claims,
                    notBefore: DateTime.UtcNow,
                    expires: DateTime.UtcNow.AddDays(1),
                    signingCredentials
                    );
                var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);


                return Json(new { success = true, code = 0, token = tokenStr, });
            }
            return Ok(new { code = -1 });
        }
        
    }
}

Startup类配置

 //jwt注入
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(options =>
                    {
                        var secretByte = Encoding.UTF8.GetBytes(Configuration["Authentication:SecretKey"]);
                        options.TokenValidationParameters = new TokenValidationParameters()
                        {
                            ValidateIssuer = true,
                            ValidIssuer = Configuration["Authentication:issuer"],

                            ValidateAudience = true,
                            ValidAudience = Configuration["Authentication:audience"],

                            ValidateLifetime = true,

                            IssuerSigningKey = new SymmetricSecurityKey(secretByte)
                        };
                    });

在这里插入图片描述
在appsettings.json中的配置

  "Authentication": {
    "SecretKey": "xixixixixixixixxixixixixixi",
    "issuer": "geren.com",
    "audience": "geren.com"

  }

在这里插入图片描述
测试接口

[HttpGet]
        public IActionResult Gettoken()
        {
            string userId = Response.HttpContext.User.Identity.Name;
            
            return Json(new { code = 0, mes = userId, });
        }

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Core Web API中,你可以使用JWT(JSON Web Token)来进行身份验证和授权。要获取当前登录用户,你需要在每个请求中检查JWT令牌,并将其解码以获取用户信息。以下是一些步骤: 1. 在你的.NET Core Web API应用程序中添加JWT身份验证中间件。你可以使用现有的第三方库,如Microsoft.AspNetCore.Authentication.JwtBearer,或者自己编写中间件。 2. 在身份验证成功后,从请求中获取JWT令牌。你可以从HTTP请求头中获取令牌,或者从请求正文中获取令牌。 3. 解码JWT令牌以获取用户信息。JWT令牌包含有关用户的信息,例如用户名、角色和权限。你可以使用JWT库来解码令牌并访问其内容。 以下是一些示例代码,演示如何在.NET Core Web API获取当前用户: ```csharp // 在Startup.cs中添加JWT身份验证中间件 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseAuthentication(); // ... } // 在Controller中获取当前用户 [Authorize] [ApiController] [Route("[controller]")] public class MyController : ControllerBase { // 获取当前用户用户名 [HttpGet] public IActionResult Get() { var username = User.Identity.Name; return Ok($"Hello, {username}!"); } } ``` 在上面的代码中,我们使用了[Authorize]属性来确保只有经过身份验证的用户才能访问MyController。然后,在Get()方法中,我们使用User.Identity.Name属性来获取当前用户用户名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值