У меня проблемы с атрибутом authorize в том, что он всегда отклоняется, даже если у меня настроены роли для администратора и менеджера. Это код для стандартной страницы идентификатора входа в систему. У меня такое чувство, что мне не хватает чего-то, что, когда пользователи входят в систему, они должны быть добавлены к роли ?. Я использую. net core 3.1 и ef core
Я чувствую, что мне нужно использовать или что-то, что находит, к какой роли принадлежит пользователь, и назначает их ему?
await userStore.AddToRoleAsync(user, "admin");
Где-то ниже
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
var user = await _userManager.FindByEmailAsync(Input.Email);
string Intitals = user.FirstName.Substring(0, 1) + user.LastName.Substring(0, 1);
_contextAccessor.HttpContext.Session.SetString("Intitals", Intitals);
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Edit 2
Я попытался даже добавить это в автозагрузку, но все равно получаю отказ в доступе, когда у меня есть пользователь в правильной группе.
services.AddAuthorization(options =>
options.AddPolicy("MISSystem",
policy => policy.RequireClaim("manager", "admin", "agent")));
Edit 3 Люди, указанные ниже, не помогли мне решить эту проблему, поэтому я создал воспроизводимую версию здесь.
https://github.com/davidbuckleyni/AuthorisationRepoMS
Также, прежде чем я не буду указывать заводской код заявки, я указываю здесь ниже.
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using MISSystem.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
namespace MISSystem.Web.Helpers {
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser> {
public MyUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor) {
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user) {
var identity = await base.GenerateClaimsAsync(user);
identity.AddClaim(new Claim("FullName", user.FirstName + " " + user.LastName ?? "[Click to edit profile]"));
return identity;
}
}
}