. net core 3 Web Api с cookie - PullRequest
       6

. net core 3 Web Api с cookie

0 голосов
/ 10 апреля 2020
  • Я пытаюсь перенести приложение из Asp. net 4.7.1 в Asp. net core 3.1.
    • Это приложение Web Api.
    • У нас есть третья часть для аутентификации, которая создает повара ie (домен) с идентификатором сессии.
    • раньше я использовал «IAuthenticationFilter», чтобы проверить, присутствует ли cook ie => no: return 401 => yes: взять идентификатор сессии, вызвать третью часть, чтобы получить имя пользователя; используйте имя пользователя для получения дополнительной информации в БД и установки объекта в моем контроллере (все мои контроллеры наследуются от пользовательского абстрактного контроллера).
    • этот фильтр добавлен в "config.Filters.Add".

Теперь я пытаюсь выполнить "тот же" процесс в. Net Ядро, но все методы, которые я пробую, не сработали.

Я читал много сайтов, MS Docs et c. и я знаю, что этот процесс сильно отличается в Net ядре. Можете ли вы объяснить, как я могу перенести эту часть моего кода?

спасибо

Обновление:

К вашему сведению: сначала мы перенесем все приложения со старой аутентификацией система (с третьей частью), и когда все приложение будет готово, мы перейдем на ADFS и OpenId connect).

Мой класс для миграции

public class InitializeApplicationContextFilterAttribute : Attribute, IAuthenticationFilter
{
    public bool AllowMultiple => false;
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        // skip the auth if attribute is present
        if (context.ActionContext.ActionDescriptor.GetCustomAttributes<DoNotCheckAuthFilterAttribute>().Any())
        {
            return;
        }

        // the action must be part of a controller inherit from CommonController
        if (!(context.ActionContext.ControllerContext.Controller is CommonController controller))
        {
            LogHelpers.AddLog(null, LogLevelEnum.High, LogTypeEnum.Exception, MessageTypeEnum.Text, $"the controller don't inherit from CommonController");
            return;
        }

        var cookie = context.Request.Headers.GetCookies(GlobalConst.OpenSSOCookieName).SingleOrDefault();
        if (cookie != null)
        {
            var sessionId = cookie.Cookies.Single(o => o.Name == GlobalConst.OpenSSOCookieName).Value;

            var checkResult = await new SSOHttpClient().CheckSession(sessionId);

            // if session exist
            if (checkResult?.Code == 1)
            {
                // for the moment, LeG read & write WS create data with user and auth. In other WS only read value (in futur version, all WS must be independant)
                await AddDataInSSOSession(context, cancellationToken, controller, sessionId, checkResult);

                // init app context with user store in SSO
                controller.InitializeAppContext(await SSOHelper.GetUser(sessionId));
                SetCookies(controller.AppContext, context.Request.Headers.GetCookies());
            }
            else
            {
                LogHelpers.AddLogAuthenticate401Action($"Session timeout session id {sessionId} ; checkResult is null {checkResult == null}");

                context.ErrorResult = new UnauthorizedResult(Enumerable.Empty<AuthenticationHeaderValue>(), context.Request);
            }
        }
        else
        {
            LogHelpers.AddLogAuthenticate401Action($"User unkwon, it must be logon");

            context.ErrorResult = new UnauthorizedResult(Enumerable.Empty<AuthenticationHeaderValue>(), context.Request);
        }

        await Task.Yield(); // use to suppress warning CS1998
    }
...