2016-11-08 11 views
3

У меня есть приложение MVC с авторизацией, управляемой сервером identityserver. Когда я впервые получаю доступ к своему веб-сайту, он перенаправляется на страницу регистрации идентификационных серверов и после того, как я снова перенаправлен на мой веб-сайт.как отключить автоматический вход в thinktecture IdentityServer

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

Я полагаю, это потому, что cookie все еще жив в клиенте (если я удалю вручную в своем браузере все файлы cookie, тогда требуется пользователь/пропуск).

Как отключить автоматический вход в систему (чтобы пользователь/пропуск всегда был необходим)?

моя конфигурация клиента запуска, как:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      LoginPath = new PathString("/Home/Logged/"), 
      AuthenticationType = "Cookies", 
      ExpireTimeSpan = TimeSpan.FromDays(2), 
      SlidingExpiration = true, 
      CookieName = ".AspNet.MyApp" 

     }); 


     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = "MyApp", 
      Authority = IS_URL, 
      RedirectUri = localHostURL + "/Home/Logged/", 
      PostLogoutRedirectUri = localHostURL + "/Account/Login/", 
      ResponseType = "code id_token token", 
      Scope = "openid profile read write sampleApi", 
      SignInAsAuthenticationType = "Cookies", 

      UseTokenLifetime = true, 

      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       SecurityTokenValidated = async n => 
       { 
        var nid = new ClaimsIdentity(
         n.AuthenticationTicket.Identity.AuthenticationType, 
         "given_name", 
         "role"); 

        // get userinfo data 
        var userInfoClient = new UserInfoClient(
         new System.Uri(n.Options.Authority + "/connect/userinfo"), 
         n.ProtocolMessage.AccessToken); 

        var userInfo = await userInfoClient.GetAsync(); 
        userInfo.Claims.ToList().ForEach(ui => nid.AddClaim(new Claim(ui.Item1, ui.Item2))); 

        //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)); 

        // keep track of access token expiration 
        nid.AddClaim(new Claim("expires_at", TimeSpan.FromDays(2).ToString())); 

        // add some other app specific claim 
        nid.AddClaim(new Claim("app_specific", "some data")); 

        n.AuthenticationTicket = new AuthenticationTicket(
         nid, 
         n.AuthenticationTicket.Properties); 
       }, 
       RedirectToIdentityProvider = n => 
       { 
        if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest) 
        { 
         var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token"); 

         if (idTokenHint != null) 
         { 
          n.ProtocolMessage.IdTokenHint = idTokenHint.Value; 
         } 
        } 

        return Task.FromResult(0); 
       } 
      } 
     }); 

Заранее спасибо!

ответ

0

При входе в систему/переадресации на idsrv установите параметр prompt в login.

OnRedirectToIdentityProvider = n => 
{ 

    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication) 
    {  
     n.ProtocolMessage.Prompt = "login"; 
    } 

    return Task.FromResult(0); 
} 

IdSrv docs (см подсказки)

prompt (optional)

login Войти интерфейс будет отображаться, даже если пользователь уже зарегистрирован и имеет действующий сеанс.

OpenId Connect spec around /authorize requests

prompt=login

Средство авторизации сервер должен запрашивать конечного пользователя для повторной аутентификации. Если он не может повторно аутентифицировать конечного пользователя, он ДОЛЖЕН вернуть ошибку, обычно login_required.

1

Чтобы выйти из сервера идентификации, вам необходимо перенаправить на конечную точку конечной сессии.

Обычно /connect/endsession. Только так можно очистить cookie сеанса аутентификации.

Смотрите спецификации: https://openid.net/specs/openid-connect-session-1_0.html#RPLogout

0

У меня было подобное требование. Не самый изящный способ, но я решил это, уменьшив срок действия файла cookie до 10 секунд и отключив ускорение. Здесь крайный край, если полагающаяся сторона возвращается в течение 10 секунд, приглашение входа в систему обходит.