2017-09-04 4 views
2

J'ai un site Web MVC5 très simple que j'essaie de sécuriser avec IdentityServer3.Pourquoi IdentityServer redirige-t-il vers http plutôt que vers https?

Mon site Web et mon instance IdentityServer sont hébergés en tant que sites distincts dans AppHarbor. Les deux sont derrière https.

Lorsque je clique sur une ressource de mon site Web protégée par un attribut [Authorize] (par exemple, /Home/About), je suis redirigé vers IdentityServer et je peux m'authentifier avec succès. Lorsque IdentityServer POSTE sa réponse sur le site Web (via app.FormPostResponse.js), le site Web répond avec une redirection 302 vers la ressource demandée - comme prévu. Cependant, cette redirection est à http, pas https (voir la trace réseau ci-dessous).

Je suis sûr que c'est juste quelque chose qui ne va pas avec ma config IdentityServer, mais j'apprécierais tous les pointeurs sur ce que j'ai tort.

(AppHarbor utilise un proxy inverse (nginx je crois) devant IIS, où SSL se termine -. Donc j'ai RequireSsl = false pour ce scénario, selon la documentation IdentityServer)

Voici mon site Startup.cs

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = "Cookies" 
     }); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      Authority = "https://<my-idsrv3>.apphb.com/identity", 

      ClientId = "<my-client-id>", 
      Scope = "openid profile roles email", 
      RedirectUri = "https://<my-website>.apphb.com", 
      ResponseType = "id_token", 

      SignInAsAuthenticationType = "Cookies", 

      UseTokenLifetime = false 
     }); 

     JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 
    } 
} 

Voici Startup.cs de mon exemple IdentityServer3:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Map("/identity", idsrvApp => 
     { 
      idsrvApp.UseIdentityServer(new IdentityServerOptions 
      { 
       SiteName = "My Identity Server", 
       SigningCertificate = Certificates.LoadSigningCertificate(), 
       RequireSsl = false, 
       PublicOrigin = "https://<my-idsrv3>.apphb.com", 

       Factory = new IdentityServerServiceFactory() 
        .UseInMemoryUsers(Users.Get()) 
        .UseInMemoryClients(Clients.Get()) 
        .UseInMemoryScopes(Scopes.Get()) 
      }); 
     }); 
    } 
} 

Voici la définition de mon site Client:

new Client 
{ 
    Enabled = true, 
    ClientName = "My Website Client", 
    ClientId = "<my-client-id>", 
    Flow = Flows.Implicit, 

    RedirectUris = new List<string> 
    { 
     "https://<my-website>.apphb.com" 
    }, 

    AllowAccessToAllScopes = true 
} 

Voici la trace de Chrome, après avoir cliqué sur 'Oui, Autoriser' sur l'écran de consentement IdentityServer:

Chrome network trace

Répondre

3

il ressemble cette question a été causé par mon site client être derrière un frontal nginx se terminant par SSL.

En ce qui concerne this GitHub issue, j'ajouté ce qui suit au début de la configuration de l'application de mon site:

app.Use(async (ctx, next) => 
{ 
    string proto = ctx.Request.Headers.Get("X-Forwarded-Proto"); 
    if (!string.IsNullOrEmpty(proto)) 
    { 
     ctx.Request.Scheme = proto; 
    } 
    await next(); 
}); 

Cela rend le site conscient du fait que les demandes entrantes étaient sur https; ceci à son tour semble garantir que le middleware IdentityServer3 génère l'uri https.