如何解决使用AddHttpContextAccessor
我有一个具有用户管理功能的Web应用程序,主要问题是管理员可以删除自己,从而使该应用程序崩溃。我本来想注册当前的用户ID,所以如果当前登录的用户ID试图删除自己,则会阻止该操作。
真正的问题在于,我不知道在尝试获取底层ID(字符串)时做错了什么
我在services.AddHttpContextAccessor();
类中添加了Startup
并添加
private readonly IHttpContextAccessor _httpContextAccessor;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options,IHttpContextAccessor httpContextAccessor)
: base(options)
{
_options = options;
_httpContextAccessor = httpContextAccessor;
}
在applicationDbContext中。
最后,在交易用户方法所在的类上,我创建了
private readonly IHttpContextAccessor _httpContextAccessor;
然后我尝试使用此代码段:
var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
,但返回null。该方法的整个上下文如下:
public async Task DeleteUsuarioAsync(String id)
{
var strategy = _context.Database.CreateExecutionStrategy();
await strategy.ExecuteAsync(async () => {
using (var transaction = _context.Database.BeginTransaction())
{
try
{
var user = _context.Users.Where(u => u.Id.Equals(id)).ToList().Last();
var _listRoles = await _userRole.getRole(_userManager,_roleManager,id);
await _userManager.RemoveFromRoleAsync(user,_listRoles[0].Text);
var dataUser = _context.TUsers.Where(u => u.IdUser.Equals(id)).ToList().Last();
var idUser = user.Id;
var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
if (idUser != "25c986cb-d0d3-41aa-aae6-cfcd2279f458")
{
if (userId == idUser)
{
}
else
{
_context.Remove(dataUser);
_context.SaveChanges();
_context.Remove(user);
_context.SaveChanges();
transaction.Commit();
}
}
else
{
}
//if (idUser == "25c986cb-d0d3-41aa-aae6-cfcd2279f458")
//{
//}
//else
//{
// _context.Remove(dataUser);
// _context.SaveChanges();
// _context.Remove(user);
// _context.SaveChanges();
// transaction.Commit();
//}
}
catch (Exception)
{
transaction.Rollback();
}
}
});
}
我在做什么错?也许还有另一种方法可以防止用户删除自己?
编辑:我忘了在控制器上添加方法inst,但是我创建了一个名为lusuarios的类。好像我在网上检查过的所有教程都在控制器上一样。
解决方法
在我添加的内容之上,IHttpContextAccessor httpContextAccessor
像这样:
public Lusuario(
UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager,RoleManager<IdentityRole> roleManager,ApplicationDbContext context,IWebHostEnvironment environment,IHttpContextAccessor httpContextAccessor)
{
_userManager = userManager;
_roleManager = roleManager;
_signInManager = signInManager;
_context = context;
_environment = environment;
_userRole = new LUsuariosRoles();
_uploadimage = new LUploadimage();
_httpContextAccessor = httpContextAccessor;
}
然后我必须将其添加到:HomeController,PerfilController以及我的类Details上,对所有这些都添加
public HomeController(
UserManager<IdentityUser> userManager,IServiceProvider serviceProvider,IHttpContextAccessor httpContextAccessor)
{
//_serviceProvider = serviceProvider;
_signInManager = signInManager;
_usuario = new Lusuario(userManager,signInManager,roleManager,context,null,httpContextAccessor);
}
然后var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
不再返回null,我可以将当前记录的用户ID与要删除的用户ID进行比较。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。