Я реализовал аутентификацию на основе ролей несколько раз до версии 2.1. Выполнил шаги, чтобы создать новую идентичность 2.1.
Я расширил модель IdentityUser, добавив дополнительные поля, логин работает нормально, новые поля присутствуют.
Службы настройки startup.cs содержат
services.AddDefaultIdentity<AppUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Я посеял роли
IdentityRole role = new IdentityRole();
role.Name = "Administrator";
IdentityResult roleResult = roleManager.
CreateAsync(role).Result;
Затем создал пользователя и добавил в роль
AppUser user = new AppUser();
user.UserName = "Admin";
user.Email = "[email protected]";
user.Name = "Administrator";
user.LockoutEnabled = false;
user.EmailConfirmed = true;
IdentityResult result = userManager.CreateAsync(user, "password").Result;
if (result.Succeeded)
{
userManager.AddToRoleAsync(user, "Administrator").Wait();
}
Все прошло успешно, и база данных выглядит нормально (у AspNetUserRoles есть ссылки)
Однако добавление к контроллеру роли всегда будет возвращать не авторизованный
[Authorize(Roles = "Administrator")]
Но простая проверка входа в систему с [Authorize]
(без роли) будет работать.
Как я могу это исправить / какой самый простой способ включить исходный код, чтобы я мог пройти / отладить теги [Authorize]
?
У вас настроены файлы cookie?
However, decorating a controller with a role will always return not authorized
[Authorize(Roles = "Administrator")]
Это известная ошибка в версии 2.1
. См. проблема здесь.
Следую совету использования старого API, предложенного HaoK и C-BERBER, и теперь он работает безотказно.
Вот мой DbContext
:
public class ApplicationDbContext : IdentityDbContext<AppUser,IdentityRole,string>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Настройте удостоверение с помощью API старого стиля:
services.AddIdentity<AppUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
Наконец, выйти и повторно войти, теперь он будет работать, как ожидалось.
Думаю, вам не захочется отлаживать сам AuthorizeAttribe
, поскольку он обрабатывается во время компиляции. Если вы хотите отладить AuthorizeFilter
, вы можете выполнить следующие шаги:
нажмите Tools
-> Options
-> Debugging
General
, отменить выбор в Enable Just My Code
в Visual StudioEnable Source Link Support
Symbols
убедитесь, что выбран Серверы Microsoft SymbolИ теперь вы можете отлаживать исходный код. Однако из-за того, как работает этот фильтр, вам нужно установить точку останова перед MVC. Я просто установил фиктивное промежуточное ПО, которое будет выполняться перед обработчиком маршрутизатора MVC:
Скриншот отладки AuthorizeFiler
:
Я добавил роль в претензии. Тогда он работает как для UI (HttpContext.User.IsInRole("Admin")
), так и для атрибута authorize
([Authorize(Roles = "Admin")]
).
Файл Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<WandContext>();
///..... other code
}
Во время аутентификации я добавляю роль в свою заявку.
var invalidLoginAttempt = false;
var user = await _userManager.FindByNameAsync(loginModel.Email);
if (user != null)
{
var result = await _signInManager.CheckPasswordSignInAsync(user, loginModel.Password, lockoutOnFailure: true);
if (result.Succeeded)
{
var customClaims = new List<Claim>
{
new Claim(ClaimTypes.Role, Role.Admin)
};
var claimsIdentity = new ClaimsIdentity(customClaims, CookieAuthenticationDefaults.AuthenticationScheme);
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
await _signInManager.Context.SignInAsync(IdentityConstants.ApplicationScheme,
claimsPrincipal, new AuthenticationProperties { IsPersistent = loginModel.RememberMe });
return LocalRedirect(returnUrl);
}
else if (result.IsLockedOut)
ModelState.AddModelError(string.Empty, "This account has been locked out, please try again later.");
else
invalidLoginAttempt = true;
}
else
invalidLoginAttempt = true;
В моем случае ASP.NET Core 3 (предварительная версия) + Angular решение было в AddAuthentication
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
});
Для отладки, возможно, вы можете использовать [Авторизовать] и добавить где-нибудь в методе действия: var Claims = User.Claims; Итак, вы можете увидеть, действительно ли претензии есть