ASP.Net Core 2.1 Промежуточное программное обеспечение WindowsPrincipal ClaimsPrincipal - PullRequest
1 голос
/ 26 марта 2019

Ситуация : У меня есть веб-сайт (только для интрасети), в котором используется вход с именем пользователя / паролем.Также можно использовать пользователя 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.

1 Ответ

0 голосов
/ 26 марта 2019

Кажется, ответ был легче, чем ожидалось.Мне нужно будет поподробнее попробовать, если это работает во всех ситуациях, как ожидалось, но в краткосрочной перспективе я нашел следующее потенциальное решение:

В промежуточном программном обеспечении добавьте следующую строку после SignInAsync():

context.User = _signInManager.CreateUserPrincipalAsync(_userService.GetCurrentUser()).Result;

Я настолько привык к тому, что пользователь только для чтения (например, когда вы используете PageModel.User), что даже не думал о возможности записи в это свойство.

Изменить: Еще один важный момент: не вызывайте промежуточное программное обеспечение слишком рано.Его следует вызывать после app.useAuthentication(), иначе вы потеряете возможность входа в систему с обычной учетной записью.

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