Создайте Cookie из носителя JWT в ядре ASP.NET - PullRequest
0 голосов
/ 19 сентября 2019

Рассказ.У меня есть следующий код (в F #, но не волнуйтесь) в ASP.NET Core 2.2

        .AddAuthentication(fun options ->
            options.DefaultScheme <- CookieAuthenticationDefaults.AuthenticationScheme
            options.DefaultChallengeScheme <- OpenIdConnectDefaults.AuthenticationScheme)
        .AddCookie(fun options ->
            options.Events.OnRedirectToLogin <- (fun ctx -> ctx.Response.StatusCode <- 401; Task.CompletedTask))
        .AddOpenIdConnect(fun options ->
            options.ClientId <- clientId
            options.Authority <- sprintf "https://login.microsoftonline.com/%s" tenantId
            options.ResponseType <- OpenIdConnectResponseType.IdToken
            options.Events <-
                OpenIdConnectEvents(
                    OnTokenValidated =
                        (fun ctx ->
                            logger.Information("Token validated for {user}", ctx.Principal.Identity.Name)
                            Task.CompletedTask),
                    OnRemoteFailure =
                        (fun ctx -> logger.Error(ctx.Failure, "OnRemoteFailure"); Task.CompletedTask),
                    OnAuthenticationFailed =
                        (fun ctx -> logger.Error(ctx.Exception, "OnAuthenticationFailed"); Task.CompletedTask))
            options.GetClaimsFromUserInfoEndpoint <- true
            options.TokenValidationParameters <-
                TokenValidationParameters(
                    NameClaimType = "name",
                    AuthenticationType = "Cookies",
                    ValidateIssuer = false))

Я хотел бы авторизовать пользователя, не перенаправляя на login.microsoftonline.com, а просто передав токен JWT, илилюбое другое «волшебное звено».

Почему? У меня есть тест на селен E2E, который постоянно имеет проблемы с login.microsoftonline.com.Я вкладываю много времени, чтобы это исправить, но я устал.Поэтому я решил вызвать Azure AD вручную, сгенерировать токен, проверить его в приложении и выпустить Cookie.

1 Ответ

0 голосов
/ 19 сентября 2019

Вы можете добавить JwtBearerAuth и определить схему политики как коммутатор.Например, на основе URL-адреса запроса:

                .AddAuthentication("guess")
                .AddPolicyScheme("guess", "guess", options =>
                {
                    options.ForwardDefaultSelector = context =>
                    {
                        if (context.Request.QueryString.Value.Contains("BearerAuth="))
                        {
                            return JwtBearerDefaults.AuthenticationScheme;
                        }

                        return CookieAuthenticationDefaults.AuthenticationScheme;
                    };
                })
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, c =>
                {
                    ...
                })
                .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, cfg =>
                {
                    // optional: setup addition al claims 
                    cfg.Events.OnTokenValidated = (ctx) => {
                        { 
                            var claims = new List<Claim>{
                                new Claim("ConfidentialAccess", "yes")};
                            var appIdentity = new ClaimsIdentity(claims);
                            ctx.Principal.AddIdentity(appIdentity);}
                        return Task.CompletedTask; };


                    cfg.SaveToken = true;
                    cfg.TokenValidationParameters = new TokenValidationParameters()
                    {
                        ClockSkew = TimeSpan.FromMinutes(5),
                        IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes("secret")),
                        ValidateIssuer = false,
                        ValidateAudience = false,
                    };
                });

Передайте свой токен в GET-запросе: "BearerAuth ="

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