Вы не можете использовать .AsNoTracking()
с await userManager.GetUserAsync(User);
.В качестве альтернативы вы можете сделать следующее:
public class AccessGuard
{
private readonly ApplicationDbContext _context;
private readonly IHttpContextAccessor _httpContextAccessor;
public AccessGuard(ApplicationDbContext context, IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_context = context;
}
public async Task<bool> IsOwnerOrHaveRightsAsync(UserManager<ApplicationUser> userManager, ApplicationUser claimant, ClaimsPrincipal User)
{
var loggedInUserId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
ApplicationUser fullUser = _context.ApplicationUsers.AsNoTracking()
.FirstOrDefaultAsync(au => au.Id == loggedInUserId);
if (claimant.Id == fullUser.Id)
{
return true;
}
return false;
}
}
Затем вам нужно зарегистрировать IHttpContextAccessor
в классе Startup
следующим образом:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Затем для доступа к услуге AccessGuard
в вашемМетод контроллера MVC, сначала зарегистрируйте AccessGuard
в Startup следующим образом:
services.AddScoped<AccessGuard>();
Затем в методе вашего контроллера:
public IActionResult Index()
{
AccessGuard accessGuardService = (AccessGuard) HttpContext.RequestServices.GetService(typeof(AccessGuard));
// Now call `accessGuardService` service method here
return View();
}
Вы также можете получить услугу AccessGuard
следующим образом:
AccessGuard accessGuardService = HttpContext.RequestServices.GetService<AccessGuard>();
и требует пространства имен using Microsoft.Extensions.DependencyInjection;