Использовать единый вход для аутентификации, а затем использовать таблицу подключенной базы данных для авторизации? - PullRequest
0 голосов
/ 01 мая 2019

TLDR: я ищу способ использовать ADFS, чтобы авторизовать пользователя для входа на мой сайт, но затем сохранить этого пользователя в базе данных для назначения ему ролей.

Я создал базовый ASPПриложение .NET MVC 5 с использованием единого входа в Visual Studio 2017 с использованием следующего.

  1. Веб-приложение ASP.NET (.Net Framework) C #
  2. Выбранный MVC
  3. Выбранные рабочие или школьные учетные записи в качестве аутентификации (я выбрал ADFS моей организации)

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

ниже - мой код

    public async Task<ActionResult> Index()
    {
        string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
        string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
        try
        {
            Uri servicePointUri = new Uri(graphResourceID);
            Uri serviceRoot = new Uri(servicePointUri, tenantID);
            ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,
                  async () => await GetTokenForApplication());

            // use the token for querying the graph to get the user details

            var result = await activeDirectoryClient.Users
                .Where(u => u.ObjectId.Equals(userObjectID))
                .ExecuteAsync();
            //IUser user = result.CurrentPage.ToList().First();
            MyUserViewModel myUserView = new MyUserViewModel();               
            myUserView.user = result.CurrentPage.ToList().First();
            myUserView.groups = GetAllGroupsForUser(activeDirectoryClient, myUserView.user);                              

            return View(myUserView);
        }
        catch (AdalException)
        {
            // Return to error page.
            return View("Error");
        }
        // if the above failed, the user needs to explicitly re-authenticate for the app to obtain the required token
        catch (Exception)
        {
            return View("Relogin");
        }
    }

Большая часть этого кода - это предварительно сгенерированный код, созданный при использовании мастера из VS для создания Приложения.

Я также создал простую базу данных в своем приложении с таблицами «пользователи» и «роли».

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

Я не могу найти, где в коде реализовать это.Когда я пытаюсь использовать тот же код из UserProfileController внутри класса CustomAuthorization, который наследует AuthorizeAttribute, асинхронные методы приводят к зависанию моего приложения или возвращению нулевых значений.

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

...