Я не могу полностью обдумать эту проблему. Когда пользователь переходит на URL-адрес администратора, он перенаправляется на указанную администратором c учетную запись / страницу входа (находится в папке области администратора). Но когда администратор входит в контроллер администратора, украшенный атрибутом [Authorize (Roles = "Admin", AuthenticationSchemes = "Backend")], страница просто перезагружается с помощью returnUrl. Кажется, что приложение не распознает вошедшего в систему пользователя для предоставления доступа к действиям контроллера администратора, не может понять, почему. Пожалуйста, помогите!
Контроллер администратора
[Authorize(Roles = "Admin", AuthenticationSchemes = "Backend")]
[Area("Admin")]
public class AdminController : Controller
{
private readonly IAdminRepository _adminInterface;
private readonly UserManager<AppUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public AdminController(IAdminRepository adminInterface, UserManager<AppUser> userManager,
RoleManager<IdentityRole> roleManager)
{
_adminInterface = adminInterface;
_userManager = userManager;
_roleManager = roleManager;
}
public IActionResult Index()
{
return View();
}
}
Контроллер учетной записи
[Area("Admin")]
public class AccountController : Controller
{
private readonly SignInManager<AppUser> _signInManager;
private readonly UserManager<AppUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public AccountController(SignInManager<AppUser> signInManager,
UserManager<AppUser> userManager, RoleManager<IdentityRole> roleManager)
{
_signInManager = signInManager;
_userManager = userManager;
_roleManager = roleManager;
}
[HttpGet]
public IActionResult Login()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model, string ReturnUrl)
{
if(ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(model.Username);
if(user != null && !(await _userManager.IsInRoleAsync(user, "Admin")))
{
ModelState.AddModelError(string.Empty, "Invalid login attempt");
return View(model);
}
if(user != null && !user.EmailConfirmed && (await _userManager.CheckPasswordAsync(user, model.Password)))
{
ModelState.AddModelError(string.Empty, "Confirm Email Address");
return View(model);
}
var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, true);
if(result.Succeeded)
{
if(!string.IsNullOrEmpty(ReturnUrl) && Url.IsLocalUrl(ReturnUrl))
{
return Redirect(ReturnUrl);
}
else
{
return RedirectToAction("index", "admin");
}
}
ModelState.AddModelError(string.Empty, "Invalid login attempt");
}
return View(model);
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddIdentity<AppUser, IdentityRole>(options =>
{
options.Password.RequiredUniqueChars = 3;
options.Password.RequiredLength = 8;
options.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddScoped<IAdminRepository, AdminRepository>();
services.AddAuthentication()
.AddCookie("Backend", options =>
{
options.Cookie.Name = "Backend";
options.LoginPath = new PathString("/admin/account/login/");
options.LogoutPath = new PathString("/admin/account/logout/");
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.LoginPath = new PathString("/account/login/");
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "AllAreas",
pattern: "{area:exists}/{controller=admin}/{action=index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=home}/{action=index}/{id?}");
});
}