Automati c вход с использованием jwt в Cook ie в ASP. net MVC Core - PullRequest
0 голосов
/ 09 марта 2020

Мой поток процессов:

  1. Пользователь входит в приложение эмитента (имя пользователя / пароль)
  2. Кликает ссылку клиентского приложения, которую он хочет перейти
  3. Приложение эмитента создает jwt и сохраняет его в Cook ie
  4. Приложение эмитента делает Response.Ridirect для клиентского приложения
  5. Клиентское приложение аутентифицирует пользователя, используя jwt в Cook ie и создает Принципал и автоматически входит в систему пользователя.

Ниже приведены настройки моего клиентского приложения при запуске ConfigureServices метод:

var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("password"));

            SigningCredentials SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var tokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
                ValidIssuer = "issuerapp",

                ValidateAudience = false,
                ValidAudience = "clientapp",

                ValidateIssuerSigningKey = true,
                IssuerSigningKey = SigningCredentials.Key,

                RequireExpirationTime = false,
                ValidateLifetime = true,

                ClockSkew = TimeSpan.Zero
            };


            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.ClaimsIssuer = "issuerapp";
                options.TokenValidationParameters = tokenValidationParameters;
                options.SaveToken = true;
            })
            .AddCookie(JwtBearerDefaults.AuthenticationScheme,
            options =>
            {
                options.Cookie.HttpOnly = true;
                options.Cookie.Name = Configuration.GetValue<string>("AppSettings:CookieName");
                options.AccessDeniedPath = authenticationSettings.AccessDeniedPath;
                options.Events = new CookieAuthenticationEvents
                {
                    // Check if JWT needs refreshed 
                    OnValidatePrincipal = RefreshTokenMonitor.ValidateAsync,
                    OnSigningOut = (context) =>
                    {
                        context.HttpContext.Response.Redirect(Configuration.GetValue<string>("AppSettings:LogoutPath"));
                        return Task.CompletedTask;
                    },
                };
            });

В моем клиенте Приложение У меня все контроллеры украшены атрибутом [Authorize].

Мне нужно, чтобы клиентское приложение автоматически аутентифицировало пользователя с помощью jwt. Что не происходит с использованием вышеупомянутых конфигураций. Мой AccessDeniedPath (метод действия) также не получает попадания.

Обходной путь, который я использовал, заключается в перенаправлении пользователя из приложения эмитента на действие входа в клиентском приложении, где:

  1. Я прочитал JWT от Повара ie
  2. Подтвердите JWT, чтобы получить Принципал
  3. Вызовите httpContext.SignInAsyn c

Как я могу Получить пользователь вошел автоматически с помощью jwt.

Любая помощь / указатель приветствуется.

Спасибо.

1 Ответ

0 голосов
/ 10 марта 2020

По умолчанию расширение AddJwtBearer получает токен из заголовка авторизации запроса:

Authorization: Bearer <token>

Но вы передаете токен в cook ie, поэтому вы можете найти токен в cook ie и установить токен в OnMessageReceived событие в AddJwtBearer:

options.Events = new JwtBearerEvents  {
    OnMessageReceived = ctx =>
    {
        ctx.Token = ctx.HttpContext.Request.Cookies["jwt"];

        return Task.CompletedTask;
    }
};
...