Проблемы с ролями администратора: «Доступ запрещен» - PullRequest
0 голосов
/ 15 июня 2019

Не могу предоставить администратору доступ к странице управления пользователями

Я изучаю ASP .Net Core и застрял на этом этапе. Я рассмотрел код, убедившись, что на одно и то же имя ссылаются классы, и протестировал разные конфигурации для сервисов Startup.cs, но не могу найти способ. Я следую учебнику под названием «Маленькая книга ASP.NET Core». Я застрял в пункте "Авторизация с ролями"

  • Это мой контроллер:

    namespace ASPDotNetCoreTodo.Controllers
    {
    //La configuración de la propiedad Roles en el atributo
    //[Authorize] garantizará que el usuario tenga que iniciar sesión y se le
    //asigne el rol de Administrador para poder ver la página.
    
    [Authorize(Roles = Constants.AdministratorRole)]
    public class ManageUsersController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;
    
        public ManageUsersController(UserManager<ApplicationUser> userManager)
        {
            _userManager = userManager;
        }
        public async Task<IActionResult> Index()
        {
            var admins = (await _userManager
                .GetUsersInRoleAsync("Administrator"))
                .ToArray();
    
            var everyone = await _userManager.Users
                .ToArrayAsync();
    
            var model = new ManageUsersViewModel
            {
                Administrators = admins,
                Everyone = everyone
            };
            return View(model);
        }
    }
    
  • Модель:

    namespace ASPDotNetCoreTodo.Models
    {
        public class ManageUsersViewModel
        {
            public ApplicationUser[] Administrators { get; set; }
            public ApplicationUser[] Everyone { get; set; }
        }
    }
    
  • Файл Startup.cs:

    namespace ASPDotNetCoreTodo
    {
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>                  options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
    
            //  services.AddIdentity<ApplicationUser, IdentityRole>()
            //      .AddEntityFrameworkStores<ApplicationDbContext>()
            //      .AddDefaultTokenProviders();
    
            services.AddDefaultIdentity<ApplicationUser>()
                    .AddRoles<IdentityRole>()
                    .AddEntityFrameworkStores<ApplicationDbContext>()
                    .AddDefaultTokenProviders()
                    ;
    
    
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
    
        //Añadimos servicio de aplicaciones
            services.AddScoped<ITodoItemService, TodoItemService>();
    
            services.AddAuthentication(); 
    
            services.AddMvc();
        }
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
    
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
    
            app.UseAuthentication();
    
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
    

Суть в том, что у меня проблемы с получением авторизации для ManageUsersController. Когда над классом используется строка [Authorize (Roles = Constants.AdministratorRole)], моя тестовая учетная запись администратора не может получить доступ к странице, даже если эта же константа используется для фильтрации учетных записей пользователей в БД и в меню и поместите их в таблицу (в представлении ManageUsers), как и ожидалось.

У меня обновление .NET Core до 2.2 и проект до ...

В любом случае, это мой GitHub: https://github.com/erniker/LearningASPNETCoreAndTests

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Ну, по любым причинам, после обновления .net Core до версии 2.2, кажется, что все равно не получается, однако при запуске Project из VS2019 вместо VSCode кажется, что Project хорошо работает.

0 голосов
/ 15 июня 2019

у вас есть функция входа в систему для администратора? или способ аутентификации пользователя?

если нет, то это потому, что приложение пытается получить доступ к функции, предназначенной для Role = Constants.AdministratorRole, во время аутентификации из куки (поскольку вы использовали аутентификацию куки), но когда аутентификация пытается проверить текущего пользователя, оно обнаружит, что нет аутентифицированного пользователя, который не позволит клиенту получить доступ к странице.

рассмотрим следующие действия:

  • сначала в файле startup.cs добавьте политику cookie после добавления аутентификации (очевидно, порядок имеет значение) и установите схему аутентификации на аутентификацию куки, чтобы сообщить приложению использовать аутентификацию из куки. я обычно использую следующее:

        //add authentication service with an encrypted cookie
        services.AddAuthentication(options => {
    
            options.DefaultScheme = Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultAuthenticateScheme = Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme;
    
        }).AddCookie(options => {
            options.SlidingExpiration = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    
            options.Cookie.Name = "ClientCookie";
        });
    
  • рассмотрите возможность добавления функции входа в систему для аутентификации пользователя с правами администратора, чтобы приложение могло правильно аутентифицировать пользователя. я использую что-то вроде этого:

    public class AuthController : Controller
    {
    private readonly string authScheme = Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme;
    
    
    [HttpPost("[action]")]
    public IActionResult Login([FromBody]JObject body)
    {
    
    
    
        //Gets inputs from Request Body
        string userName = body[UserModelConstants.Username].ToString();
        string password = body[UserModelConstants.Password].ToString();
    
        //use the username and password to check if the user is ok or not
        //then get his claim from database or fill them yourself but make sure to have a role type claim with the value "Administrator" for the admin user
        List<Claim> claims = getUserClaims();
    
        //now you have to create the user identity and principle
        ClaimsIdentity CI = new ClaimsIdentity(claims, Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme, 
            ClaimTypes.Name, ClaimTypes.Role);
        ClaimsPrincipal CP = new ClaimsPrincipal(CI);
    
    
        return SignIn(CP, authScheme);//sign in the user so it can be checked when the user is being authorized to access the function.
    
    }
    

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

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