2017-09-29 2 views
1

Ich habe IdentityServer3 lokal eingerichtet und alles funktioniert gut. Ich verwende JWT, um meine Benutzer zu autorisieren und erfolgreich auf meine Web-API-Controller zugreifen zu können (mit dem Attribut authorize).Setup IdentityServer3 in Azure

Wenn ich in Azure hochgeladen, obwohl ich ein Access-Token erhalten kann, aber wenn ich versuche, auf einen Controller zuzugreifen, erhalte ich einen Fehler 401. Ich gehe davon aus, dass dies mit dem Zertifikat zu tun hat. Meine Konfiguration sieht wie folgt aus:

public static class Config 
{ 

    /// <summary> 
    /// Configures identity server 
    /// </summary> 
    public static void ConfigureIdentityServer(this IAppBuilder app, CormarConfig config) 
    { 

     // Create our options 
     var identityServerOptions = new IdentityServerOptions 
     { 
      SiteName = "Cormar API", 
      SigningCertificate = LoadCertificate(), 
      IssuerUri = "https://localhost:44313", 

      // Not needed 
      LoggingOptions = new LoggingOptions 
      { 
       EnableHttpLogging = true, 
       EnableWebApiDiagnostics = true, 
       EnableKatanaLogging = true, 
       WebApiDiagnosticsIsVerbose = true 
      }, 

      // In membory crap just to get going 
      Factory = new IdentityServerServiceFactory().Configure(config),   

      // Disable when live 
      EnableWelcomePage = true 
     }; 

     // Setup our auth path 
     app.Map("/identity", idsrvApp => 
     { 
      idsrvApp.UseIdentityServer(identityServerOptions); 
     }); 
    } 


    /// <summary> 
    /// Configures the identity server to use token authentication 
    /// </summary> 
    public static void ConfigureIdentityServerTokenAuthentication(this IAppBuilder app, HttpConfiguration config) 
    { 
     app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
     { 
      Authority = "https://localhost:44313/identity", 
      ValidationMode = ValidationMode.ValidationEndpoint, 
      RequiredScopes = new[] { "api" } 
     }); 

     AntiForgeryConfig.UniqueClaimTypeIdentifier = IdentityServer3.Core.Constants.ClaimTypes.Subject; 
     JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 
    } 

    /// <summary> 
    /// Loads the certificate 
    /// </summary> 
    /// <returns></returns> 
    private static X509Certificate2 LoadCertificate() 
    { 
     var certPath = $"{ AppDomain.CurrentDomain.BaseDirectory }App_Data\\idsrv3test.pfx"; 
     return new X509Certificate2(certPath, "idsrv3test"); 
    } 

    /// <summary> 
    /// Configure the identity service factory with custom services 
    /// </summary> 
    /// <returns></returns> 
    private static IdentityServerServiceFactory Configure(this IdentityServerServiceFactory factory, CormarConfig config) 
    { 
     var serviceOptions = new EntityFrameworkServiceOptions { ConnectionString = config.SqlConnectionString }; 
     factory.RegisterOperationalServices(serviceOptions); 
     factory.RegisterConfigurationServices(serviceOptions); 

     factory.CorsPolicyService = new Registration<ICorsPolicyService>(new DefaultCorsPolicyService { AllowAll = true }); // Allow all domains to access authentication 
     factory.Register(new Registration<DbContext>(dr => dr.ResolveFromAutofacOwinLifetimeScope<DbContext>())); 
     factory.UserService = new Registration<IUserService>(dr => dr.ResolveFromAutofacOwinLifetimeScope<IUserService>()); 
     factory.ClientStore = new Registration<IClientStore>(dr => dr.ResolveFromAutofacOwinLifetimeScope<IClientStore>()); 
     factory.ScopeStore = new Registration<IScopeStore>(dr => dr.ResolveFromAutofacOwinLifetimeScope<IScopeStore>()); 

     return factory; 
    } 
} 

Ich habe gelesen, und es sieht aus wie wenn ich Referenz-Token verwenden, ich habe nicht ein Zertifikat verwenden müssen, um sie zu unterschreiben. Also änderte ich meinen Klienten AccessTokenType Token zu verweisen und hinzugefügt, um das Geheimnis des api Umfang und ich konnte vor Ort meine geschützten Controller zugreifen, aber wieder, wenn ich auf azur drücken, bekomme ich immer noch ein 401.

Weiß jemand, wie ich dieses Problem lösen kann?

+0

aber wenn in azurblau läuft, warum haben Sie localhost und port 44313? Und ist dieser Port in der Azure-Firewall geöffnet? (Website-Konfiguration)? – rmjoia

+0

Sie können immer twittern [Dominick Baier] (https://twitter.com/leastprivilege) – rmjoia

+0

@rmjoia der IssuerUri kann jederzeit geändert werden. Das ist nur der localhost beim Testen, aber das verursacht nicht das Problem Ich habe – r3plica

Antwort

1

Ändern der Einstellungen für UseIdentityServerBearerTokenAuthentication war die Lösung für dieses Problem. ich die Optionen dieses Update:

DelayLoadMetadata = true, 

Und alles begann zu arbeiten.

Verwandte Themen