отправка запроса на завершение сеанса на сервер идентификации вызывает ошибку

У меня есть приложение ASP.NET MVC с фреймворком 4.7.2. Приложение настроено на использование IdentityServer3 с помощью OpenIDConnect. Когда пользователь нажимает кнопку «Выход», вызывается следующий код

Метод действия Сначала вызывается метод действия выхода из системы.

    [HttpPost]
    public ActionResult Logout()
    {
        Session.Clear();
        if (Request.IsAuthenticated)
        {
            Request.GetOwinContext().Authentication.SignOut();
        }            
        return Redirect("/");
    }

В Owin Startup.cs я настроил OpenIDConnect. Далее срабатывает событие RedirectToIdentityProvider. Здесь я устанавливаю IdTokenHint, когда RequestType имеет значение Logout.

    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var cookieOptions = new CookieAuthenticationOptions
            {
                AuthenticationType = "Cookies",
                LoginPath = new Microsoft.Owin.PathString("/Home"),
                SlidingExpiration = true,
                ExpireTimeSpan = GetCookieExpiration()
            };

        var openIdOptions = new OpenIdConnectAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["id:Authority"],
            Scope = "openid email profile",
            ClientId = "My ClientId",
            RedirectUri = "http://localhost:58641/Home",
            ResponseType = "id_token",
            SignInAsAuthenticationType = "Cookies",
            UseTokenLifetime = false,

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                SecurityTokenValidated = (context) =>
                {
                    //code here removed for brevity 

                    return Task.FromResult(0);
                },

                RedirectToIdentityProvider = (context) =>
                {
                    if (context.ProtocolMessage.RequestType == Microsoft.IdentityModel.Protocols.OpenIdConnectRequestType.LogoutRequest)
                    {
                        var idTokenHint = context.OwinContext.Authentication.User.FindFirst("id_token").Value;
                        context.ProtocolMessage.IdTokenHint = idTokenHint;
                        
                    }
                    return Task.FromResult(0);
                }
            }
        };

        app.UseCookieAuthentication(cookieOptions);
        app.UseOpenIdConnectAuthentication(openIdOptions);

        MvcHandler.DisableMvcResponseHeader = true;            
    }

Я скрипач, я вижу, что он звонит

/identity/connect/endsession?id_token_hint= xxxxxxxx Однако используется HTTP-глагол OPTIONS. Итак, IdentityServer выдает ошибку The requested resource does not support http method 'OPTIONS'

введите здесь описание изображения

Не уверен, что мне здесь не хватает.

Изменить 1

В консоли браузера я вижу следующую ошибку

Доступ к XMLHttpRequest по адресу «https://localhost:44300/identity/connect/endsession?id_token_hint=xxxxxxx» (перенаправлен с «http://localhost:58641/account/logout») из источника «http://localhost:58641». ' был заблокирован политикой CORS: ответ на предварительный запрос не проходит проверку управления доступом: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin".

Изменить 2
У меня есть другое приложение ASP.NET с таким же кодом выхода. Но он делает GET запрос на завершение сеанса.


comment
Вы изменили файл web.config в IdServer, чтобы разрешить метод OPTIONS? Должна быть запись вида: ‹add name=Access-Control-Allow-Methods value=GET, PUT, POST, DELETE, OPTIONS, HEAD /›   -  person TejSoft    schedule 23.07.2020
comment
Думаю, это будет взлом. Во-первых, клиент не должен использовать глагол OPTIONS.   -  person LP13    schedule 26.07.2020


Ответы (1)


Когда вы видите использование OPTIONS и запрос содержит заголовок источника, то это запрос предварительной проверки CORS. Это дополнительный запрос безопасности, который возникает, когда клиент JavaScript пытается сделать запрос AJAX к API.

Это предназначено для запуска endsession из JavaScript? если это так, вам нужно для этого клиента в наборе identityServer:

AllowedCorsOrigins =
{
    "https://localhost:xxxxx"
},

Это устанавливается для каждого клиента в IdentityServer.

person Tore Nestenius    schedule 01.08.2020