Arhn - архитектура программирования

Атрибут авторизации на основе ролей не работает в ASP.NET Core MVC

Я пытаюсь создать приложение в ASP.NET Core MVC и использовать авторизацию на основе ролей с проверкой подлинности Windows.

Несмотря на то, что я добавил все роли в HttpContext на своем базовом контроллере, он по-прежнему не выдает запрос/ошибку несанкционированного доступа при переходе к контроллеру с моей учетной записью, не имеющей требуемой роли.

Единственная проблема, о которой я думаю, это, возможно, я неправильно настроил авторизацию в Startup.cs?

Вот мой Startup ConfigureService:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<CimsDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyDatabase")));

    services.AddControllersWithViews();
    services.AddDistributedMemoryCache();
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    services.AddAuthorization();


    services.AddSingleton(Configuration);
    services.AddSession(options =>
    {
        options.Cookie.Name = ".MySession";
        options.IdleTimeout = TimeSpan.FromMinutes(Convert.ToDouble(Configuration.GetSection("inMinutes").Value));
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });
}

Вот моя конфигурация запуска:

public void Configure(IApplicationBuilder app)
{
    if (_env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseSession();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}           

Затем мой базовый класс контроллера:

[AllowAnonymous]
public class AppSessionController : Controller
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (HttpContext.User.Identity.IsAuthenticated)
        {
            //no valid session / create new session
            if (String.IsNullOrEmpty(HttpContext.Session.GetString(AppSessionIdentifier.IsAlive)))
            {
                //initialize new user identity
                HttpContext.User = UserIdentity.NewUserIdentity(config, HttpContext);
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

А дальше моя функция NewUserIdentity:

public static GenericPrincipal NewUserIdentity(IConfiguration config, HttpContext httpContext)
{
    
    string AccountName = httpContext.User.Identity.Name.Split('\\')[1];
    string Env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    List<string> roles = new List<string>();
    if (ADHelper.IsInGroup(AccountName, config.GetSection($"ADGroupRoles:{Env}:ReadOnly").Value))
        roles.Add(Roles.ReadOnly.ToString());
    if(ADHelper.IsInGroup(AccountName, config.GetSection($"ADGroupRoles:{Env}:Admin").Value))
        roles.Add(Roles.Admin.ToString());

    return new GenericPrincipal(new GenericIdentity(AccountName), roles.ToArray());
}

Мой контроллер с атрибутом авторизации:

    [Authorize(Roles = "ReadOnly")]
    public class MatterController : AppSessionController
    {
        [Authorize(Roles = "ReadOnly")]
        public ActionResult Details(int matterId)
        {
            return View();
        }
   }

Мои роли перечислены:

public enum Roles
{
    [Description("ReadOnly")]
    ReadOnly = 1,

    [Description("Administrator")]
    Admin = 4
}

  • зачем вам нужно использовать AllowAnonymous на базовом контроллере? это вообще не имеет смысла. AllowAnonymousAttribute по-прежнему влияет на производный контроллер и имеет более высокий приоритет, чем все остальные AuthorizeAttribute (это означает, что все они будут игнорироваться в пользу затрагиваемого только AllowAnonymousAttribute). Все просто: вам просто нужно удалить AllowAnonymousAttribute на базовом контроллере. Если это не ваш код, который можно изменить, решение может быть более сложным. 15.01.2021
  • Привет @KingKing, я пытался удалить анонимный атрибут в контроллере базового класса, но столкнулся с ошибкой ниже: System.InvalidOperationException: не была указана схема аутентификации, и не было найдено DefaultChallengeScheme. поэтому я предполагаю, что мне все еще нужно авторизовать их атрибут? 17.01.2021

Ответы:


1

Ладно, я разобрался, и, как сказал Кинг, мне просто нужно удалить атрибут Anonymous в моем базовом контроллере. Хотя моя основная проблема заключалась в том, что когда я запускаю свое веб-приложение в IIS Express, запущенном в Chrome, аутентификация Windows не работает. Поэтому мне нужно переключиться на IE или MS Edge. К счастью, MS Edge очень похож на Chrome, поэтому я не потерял ни одного инструмента веб-разработки, который мне нужен в Chrome.

TLDR: проверка подлинности Windows не работает в IIS Express, запущенном в Chrome, только в IE и MS Edge.

17.01.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..