Asp.net core 为什么我';我在httpget的结果中得到一个空数组?
我有StatUserModel(代码如下) StatsUserModel.csAsp.net core 为什么我';我在httpget的结果中得到一个空数组?,asp.net-core,postman,Asp.net Core,Postman,我有StatUserModel(代码如下) StatsUserModel.cs namespace WebAPI.Models { public class StatsUserModel { public int DeviceID { get; set; } public int bloodpress_sys { get; set; } public int bloodpress_dia { get; set; }
namespace WebAPI.Models
{
public class StatsUserModel
{
public int DeviceID { get; set; }
public int bloodpress_sys { get; set; }
public int bloodpress_dia { get; set; }
public int saturation { get; set; }
public int BPM { get; set; }
public int veinsdiameter { get; set; }
public string Id { get; set; }
}
}
namespace WebAPI.Models
{
public class AuthenticationContext : IdentityDbContext
{
public AuthenticationContext(DbContextOptions options):base(options)
{
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<StatsUserModel> statsUserModels { get; set; }
}
}
namespace WebAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class StatsController : ControllerBase
{
private UserManager<ApplicationUser> _userManager;
private AuthenticationContext context;
public StatsController(AuthenticationContext _context, UserManager<ApplicationUser> userManager)
{
context = _context;
_userManager = userManager;
}
[HttpGet]
[Authorize]
public async Task<Object> GetStats(LoginModel model)
{
string userId = User.Claims.First(c => c.Type == "UserID").Value;
var user = await _userManager.FindByIdAsync(userId);
var data = context.statsUserModels.Where(s => s.Id == user.Id);
return data;
}
}
}
我有来自AspNetUsers的用户
我有AuthenticationContext.cs
namespace WebAPI.Models
{
public class StatsUserModel
{
public int DeviceID { get; set; }
public int bloodpress_sys { get; set; }
public int bloodpress_dia { get; set; }
public int saturation { get; set; }
public int BPM { get; set; }
public int veinsdiameter { get; set; }
public string Id { get; set; }
}
}
namespace WebAPI.Models
{
public class AuthenticationContext : IdentityDbContext
{
public AuthenticationContext(DbContextOptions options):base(options)
{
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<StatsUserModel> statsUserModels { get; set; }
}
}
namespace WebAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class StatsController : ControllerBase
{
private UserManager<ApplicationUser> _userManager;
private AuthenticationContext context;
public StatsController(AuthenticationContext _context, UserManager<ApplicationUser> userManager)
{
context = _context;
_userManager = userManager;
}
[HttpGet]
[Authorize]
public async Task<Object> GetStats(LoginModel model)
{
string userId = User.Claims.First(c => c.Type == "UserID").Value;
var user = await _userManager.FindByIdAsync(userId);
var data = context.statsUserModels.Where(s => s.Id == user.Id);
return data;
}
}
}
名称空间WebAPI.Models
{
公共类AuthenticationContext:IdentityDbContext
{
公共AuthenticationContext(DbContextOptions):基本(选项)
{
}
公共数据库集应用程序用户{get;set;}
公共数据库集StatUserModels{get;set;}
}
}
因此,我创建了statcontroller和HttpGet方法
statcontroller.cs
namespace WebAPI.Models
{
public class StatsUserModel
{
public int DeviceID { get; set; }
public int bloodpress_sys { get; set; }
public int bloodpress_dia { get; set; }
public int saturation { get; set; }
public int BPM { get; set; }
public int veinsdiameter { get; set; }
public string Id { get; set; }
}
}
namespace WebAPI.Models
{
public class AuthenticationContext : IdentityDbContext
{
public AuthenticationContext(DbContextOptions options):base(options)
{
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<StatsUserModel> statsUserModels { get; set; }
}
}
namespace WebAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class StatsController : ControllerBase
{
private UserManager<ApplicationUser> _userManager;
private AuthenticationContext context;
public StatsController(AuthenticationContext _context, UserManager<ApplicationUser> userManager)
{
context = _context;
_userManager = userManager;
}
[HttpGet]
[Authorize]
public async Task<Object> GetStats(LoginModel model)
{
string userId = User.Claims.First(c => c.Type == "UserID").Value;
var user = await _userManager.FindByIdAsync(userId);
var data = context.statsUserModels.Where(s => s.Id == user.Id);
return data;
}
}
}
名称空间WebAPI.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类StatsController:控制器数据库
{
私人用户管理器(UserManager);;
私有身份验证上下文;
公共StatsController(AuthenticationContext\u context,UserManager UserManager)
{
上下文=_上下文;
_userManager=userManager;
}
[HttpGet]
[授权]
公共异步任务GetStats(LoginModel模型)
{
字符串userId=User.Claims.First(c=>c.Type==“userId”).Value;
var user=await\u userManager.FindByIdAsync(userId);
var data=context.statUserModels.Where(s=>s.Id==user.Id);
返回数据;
}
}
}
生成JWT
[HttpPost]
[Route("Login")]
public async Task<IActionResult> Login(LoginModel loginModel)
{
var user = await _userManager.FindByNameAsync(loginModel.UserName);
if(user != null && await _userManager.CheckPasswordAsync(user, loginModel.Password))
{
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim("UserID", user.Id.ToString())
}),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_applicationSettings.JWT_Secret)), SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);
return Ok(new { token });
}
else
{
return BadRequest(new { message = "Username or password invalid" });
}
}
[HttpPost]
[路线(“登录”)]
公共异步任务登录(LoginModel LoginModel)
{
var user=await\u userManager.FindByNameAsync(loginModel.UserName);
if(user!=null&&await\u userManager.CheckPasswordAsync(user,loginModel.Password))
{
var tokenDescriptor=新的SecurityTokenDescriptor
{
主题=新的索赔实体(新的索赔[]
{
新声明(“UserID”,user.Id.ToString())
}),
Expires=DateTime.Now.AddDays(1),
SigningCredentials=新的SigningCredentials(新的SymmetricSecurityKey(Encoding.UTF8.GetBytes(_applicationSettings.JWT_Secret)),SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler=new JwtSecurityTokenHandler();
var securityToken=tokenHandler.CreateToken(tokenDescriptor);
var token=tokenHandler.WriteToken(securityToken);
返回Ok(新的{token});
}
其他的
{
返回BadRequest(新的{message=“用户名或密码无效”});
}
}
我使用Postman来测试登录,它会返回一个JWT令牌,一切正常,但当我传递登录名和密码时,它会返回一个带有200OK代码的空数组,修复了,我已经进行了添加迁移,再次填充了表,一切正常,谢谢Rena 我建议您可以调试代码以检查
userId
是否包含值。以及您是否获得userId
。如果您没有获得userId
,请分享您是如何生成jwt令牌的。从输出中,我有:选择[s].[Id],[s].[BPM],[s].[DeviceID],[s].[s].[bloodpress\u-dia],[s].[bloodpress\u-sys]。[s].[s].[veinsdiameter]WebAPI>来自[StatusUserModels]AS[s]WebAPI>其中[s].[Id]=@.[u用户Id\u 0正在处理身份验证时,我得到以下信息:选择顶部(1)[u].[Id],[u].[AccessFailedCount],[u].[ConcurrencyStamp],[u].[Discriminator],[u].[E],[u],[u].[u].[EmailConfirmmed],[u].[u].[Lockouted],[u].[LockoutEnd],[u].[NormalizedEmail],[u].[NormalizedUserName],[u].[PasswordHash],[u].[PhoneNumber],[u].[PhoneNumberConfigured],[u].[SecurityStamp],[u].[TwoFactorEnabled],[u].[UserName],[u].[FullName]WebAPI>,来自[AspNetUsers]作为[u]您可能误解了我的意思。您需要调试vs中的代码,以检查哪一行不查询数据。有关如何调试代码:因此,我得到的是用户ID,但用户和数据为空