.net core identity 2.1 роль авторизации не работает - PullRequest
0 голосов
/ 27 сентября 2018

Я реализовал аутентификацию на основе ролей несколько раз до 2.1.Следуя инструкциям по созданию новых идентификаторов 2.1.

Я расширил модель IdentityUser, добавив дополнительные поля, вход в систему работает нормально, появились новые поля.

startup.cs configure services содержит

         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 = "admin@admin.com";
        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]?

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Я добавил роль в претензии.Затем он работает как для пользовательского интерфейса (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;
0 голосов
/ 06 июня 2019

В моем случае 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;
});
0 голосов
/ 27 сентября 2018

Как исправить

Однако украшение контроллера с ролью всегда вернет несанкционированный

  [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

  1. в пределах General, отмените выбор Enable Just My Code в Visual Studio
  2. выберите Enable Source Link Support
  3. в пределах Symbols, убедитесь, что Серверы Microsoft Symbol

И теперь вы можете отлаживать исходный код.Однако из-за того, как работает фильтр, вам нужно установить точку останова перед MVC.Я просто установил фиктивное промежуточное программное обеспечение, которое будет выполняться перед обработчиком маршрутизатора MVC:

enter image description here

Скриншот отладки AuthorizeFiler:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...