Атрибут авторизации всегда запрещен, даже если в правильной группе - PullRequest
0 голосов
/ 13 июля 2020

У меня проблемы с атрибутом 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;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 21 июля 2020

Я, наконец, нашел причину по какой-то причине в другом примере, где они использовали настраиваемую фабрику утверждений, мой код на самом деле этого не требует, поэтому, как только я удалил эту строку.

.AddClaimsPrincipalFactory ();

Он работал, как ожидалось, для атрибута менеджера

0 голосов
/ 14 июля 2020

Это код для стандартной страницы идентификатора входа. У меня такое чувство, что мне не хватает чего-то, что, когда пользователи входят в систему, они должны быть добавлены к роли?

Вы можете использовать UserManager.AddToRoleAsyn c (TUser, String) метод для добавления указанного c пользователя в роль, как показано ниже.

var user = await _userManager.FindByNameAsync("test@example.com");

await _userManager.AddToRoleAsync(user, "admin");

И вы можете проверить, ожидалась ли запись (UserId- RoleId) действительно добавлен в базу данных AspNetUserRoles таблица

enter image description here

Besides, please make sure you have create admin role using RoleManager.CreateAsyn c (TRole) метод .

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