TLDR: я ищу способ использовать ADFS, чтобы авторизовать пользователя для входа на мой сайт, но затем сохранить этого пользователя в базе данных для назначения ему ролей.
Я создал базовый ASPПриложение .NET MVC 5 с использованием единого входа в Visual Studio 2017 с использованием следующего.
- Веб-приложение ASP.NET (.Net Framework) C #
- Выбранный MVC
- Выбранные рабочие или школьные учетные записи в качестве аутентификации (я выбрал 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, асинхронные методы приводят к зависанию моего приложения или возвращению нулевых значений.
Я знаю, что, должно быть, упускаю что-то простое, и я уверен, что есть статья, объясняющая, как это сделать где-то.Если бы кто-то мог просто указать мне правильное направление, это было бы очень ценно.