Как автоматически войти в систему пользователя Okta с активным сеансом входа в систему - PullRequest
1 голос
/ 02 апреля 2020

У меня есть приложение. NET 4.5 Web Forms с аутентификацией Okta сверху. Настройка аутентификации работает нормально; Я могу войти в систему и выйти из системы и получить информацию о пользователе Okta / претензии из переменной контекста.

Что я хотел бы сделать, это определить при загрузке страницы, есть ли у пользователя активный сеанс Okta в своем браузере, а затем войти их в приложение. Или, если у них нет сеанса, ничего не делайте и оставайтесь на странице приложения.

Посылка вызова для менеджера аутентификации

HttpContext.Current.GetOwinContext().Authentication.Challenge(
    new AuthenticationProperties { RedirectUri = "/Login.aspx" },
    OpenIdConnectAuthenticationDefaults.AuthenticationType);

почти делает то, что я хочу. Если у пользователя есть активный сеанс, он делает некоторые перенаправления и регистрирует их. Но если они не вошли в систему, они отправляются и остаются на странице входа в Okta. Это не то, чего я хочу.

Я думал, что смогу получить доступ к некоторым файлам cookie, которые Okta устанавливает, когда пользователь входит в систему через страницу Okta, но при проверке через отладчик браузера и проверке Request.Cookies они на данном этапе, кажется, недоступен. И у контекста также нет доступа к пользовательской информации.

edit: Кроме того, если это помогает, это то, как выглядит мой Startup.cs

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using IdentityModel.Client;
using Microsoft.AspNet.Identity;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using System.Collections.Generic;
using System.Configuration;
using System.Security.Claims;

[assembly: OwinStartup(typeof(WebApplication.Startup))]

namespace WebApplication
{
    public class Startup
    {

        // These values are stored in Web.config. Make sure you update them!
        private readonly string _clientId = ConfigurationManager.AppSettings["okta:ClientId"];

        private readonly string _redirectUri = ConfigurationManager.AppSettings["okta:RedirectUri"];
        private readonly string _authority = ConfigurationManager.AppSettings["okta:OrgUri"];
        private readonly string _clientSecret = ConfigurationManager.AppSettings["okta:ClientSecret"];

        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }

        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions());

            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                ClientId = _clientId,
                ClientSecret = _clientSecret,
                Authority = _authority,
                RedirectUri = _redirectUri,
                ResponseType = OpenIdConnectResponseType.CodeIdToken,
                Scope = "openid profile email offline_access",
                TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" },
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthorizationCodeReceived = async n =>
                    {
                        // Exchange code for access and ID tokens
                        var tokenClient = new TokenClient($"{_authority}/v1/token", _clientId, _clientSecret);

                        var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, _redirectUri);
                        if (tokenResponse.IsError)
                        {
                            throw new Exception(tokenResponse.Error);
                        }

                        var userInfoClient = new UserInfoClient($"{_authority}/v1/userinfo");
                        var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);

                        var claims = new List<Claim>(userInfoResponse.Claims)
                        {
                            new Claim("code", n.Code),
                            new Claim("id_token", tokenResponse.IdentityToken),
                            new Claim("refresh_token", tokenResponse.RefreshToken),
                            new Claim("access_token", tokenResponse.AccessToken)
                        };

                        n.AuthenticationTicket.Identity.AddClaims(claims);
                    },
                },
            });
        }
    }
}
...