HttpContext.Request.IsAuthenticated имеет значение false в запросе Ajax + проверка подлинности OpenID Connect Cook * ie - PullRequest
0 голосов
/ 09 января 2020

Мы используем аутентификацию на основе OpenIdConnect в приложении asp. net mvc. Первоначальный вход работает нормально. Но когда мы используем вызов Ajax для вызова метода действия, пользователь приходит как не прошедший проверку подлинности. Я проверил в пользовательской авторизации - HttpContext.Request.IsAuthenticated приходит как ложное.

Я проверил повара ie ".AspNet.Cookies", и он имеет значение. Почему открытый идентификатор не аутентифицирует пользователя.

Ниже мой код аутентификации

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = AuthenticationConfig.ClientId,
                Authority = AuthenticationConfig.AADInstance + AuthenticationConfig.TenantId,
                PostLogoutRedirectUri = AuthenticationConfig.PostLogoutRedirectURI,
                RedirectUri = AuthenticationConfig.RedirectUri,
                Scope = OpenIdConnectScope.OpenIdProfile,
                ResponseType = OpenIdConnectResponseType.Code,
                SaveTokens = true,

                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(AuthenticationConfig.ClientSecret)),
                    ValidateIssuer = true,
                    ValidIssuer = AuthenticationConfig.AADInstance + AuthenticationConfig.TenantId + "/v2.0",
                },

                SignInAsAuthenticationType = "Cookies",

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    // when an auth code is received...
                    AuthorizationCodeReceived = OnAuthorizationCodeReceived,
                    AuthenticationFailed = OnAuthenticationFailed,
                    SecurityTokenValidated = async n =>
       {
           var nid = new ClaimsIdentity(n.AuthenticationTicket.Identity);

           //var claimsIdentity = filterContext.HttpContext.User.Identity as ClaimsIdentity;
           var user = nid.Claims.Where(r => r.Type == PreferedUserNameClaimType).Select(v => v.Value).FirstOrDefault();

           var userRolesroles = GetRolesForUser(user);

           //nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));

           userRolesroles.ToList().ForEach(ui => nid.AddClaim(new Claim(ClaimTypes.Role, ui)));

           // keep the id_token for logout
           nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

           // add access token for sample API
           nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));

           n.AuthenticationTicket = new AuthenticationTicket(
              nid,
              n.AuthenticationTicket.Properties);

           UserService.SetUserInformation(user);

       },
                    RedirectToIdentityProvider = ctx =>
                    {
                        bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest");

                        if (ctx.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
                        {
                            if (isAjaxRequest && ctx.Response.StatusCode == (int)HttpStatusCode.Unauthorized)
                            {
                                ctx.Response.Headers.Remove("Set-Cookie");
                                ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                                ctx.HandleResponse();
                                return Task.FromResult(0);
                            }
                        }
                        return Task.FromResult(0);

                    }
                }

            });


    }

1 Ответ

0 голосов
/ 09 января 2020

Обычно в asp. net ApiControllers не имеет понятия аутентификации вашего контроллера. В зависимости от того, как все устроено, вам нужно добавить заголовок авторизации с токеном доступа к каналу, чтобы сообщить API об аутентифицированном пользователе.

...