Ситуация : У меня есть веб-сайт (только для интрасети), в котором используется вход с именем пользователя / паролем.Также можно использовать пользователя Windows для входа в систему.
Что я делаю : когда пользователь заходит на страницу на этом сайте и еще не вошел в систему с именем пользователя / паролем,вместо этого пользователь войдет в систему с аутентификацией Windows.Это приводит к тому, что его HttpContext.User
объект имеет тип WindowsPrincipal
.Затем я автоматически авторизирую пользователя в соответствующем пользователе через SignInManager<User>.SignInAsync()
.Теперь у пользователя есть все роли, указанные в моей базе данных, вместо ролей, заданных AD.
Проблема с текущим подходом : Изначально это переписывание было только на начальной странице по умолчанию.,Таким образом, я мог бы перезагрузить эту страницу явно после выполнения знака в части.Если бы пользователь вместо этого перешел на другую подстраницу (например, через закладку), это переписывание типа аутентификации было бы пропущено => он остался WindowsPrincipal
.
Моя попытка решения : Входить в систему частично через промежуточное ПО.У меня есть служба (которая реализует IMiddleware, сравните https://stackoverflow.com/a/52214120/2968106), которая делает это в методе InvokeAsync ().
Проблема с моим решением : вход в систему как пользователь с моимПромежуточное ПО происходит слишком поздно, поэтому соответствующая страница возвращает «Отказано в доступе», так как в этот момент пользователю не хватает необходимой роли. Загрузка страницы снова исправляет это. Я вызвал промежуточное ПО в методе Configure
Startup.cs
после app.UseAuthentication()
и app.UseSession()
. Перемещение до этих двух ничего не меняет.
Вопрос : а) Возможен ли такой подход;б) В какой момент я должен вызвать это, или есть метод для повторного запроса данной страницы со всеми неповрежденными параметрами изнутри промежуточного программного обеспечения после завершения входа в систему?
В отношении б):есть какая-то функция для перезапуска конвейера с самого начала, которую я могу вызывать в своем промежуточном программном обеспечении после SignInAsync()
?
Edit :
1) Мое промежуточное программное обеспечение
public class WindowsPrincipalToClaimPrincipal :IMiddleware
{
private readonly SignInManager<User> _signInManager;
private readonly UserService _userService;
public WindowsPrincipalToClaimPrincipal(SignInManager<User> signInManager, UserService userService)
{
_signInManager = signInManager;
_userService = userService;
}
public Task InvokeAsync(HttpContext context, RequestDelegate next)
{
if (context.User is WindowsPrincipal)
{
_signInManager.SignInAsync(_userService.GetCurrentUser(), false).Wait();
}
return next(context);
}
}
2) Соответствующие части Startup.cs
//At the end of ConfigureServices()
services.AddScoped<WindowsPrincipalToClaimPrincipal>();
//Inside Configure(), before app.UseMvc(...);
app.UseAuthentication();
app.UseSession();
app.UseMiddleware<WindowsPrincipalToClaimPrincipal>(); //moving this line to the beginning of Configure() doesn't change anything.