2017-09-29 4 views
1

私はIdentityServer3をローカルにセットアップしていますが、すべて正常に動作します。 JWTを使用してユーザーを認証し、Web APIコントローラー(authorize属性付き)に正常にアクセスできました。azureのIdentityServer3

私はazureにアップロードしたときにアクセストークンを取得できますが、コントローラにアクセスしようとすると401エラーが発生します。 これは証明書と関係があると仮定します。 私の構成は次のようになります。

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; 
    } 
} 

私が読んでいると私は、参照トークンを使用している場合、私はそれらに署名する証明書を使用する必要はありませんように見えます。だから私は私のクライアントAccessTokenTypeトークン参照するために変更され、APIスコープに秘密を追加し、私はローカルに私の保護されたコントローラにアクセスすることができましたが、私は紺碧に押すと、再び、私はまだ401

を取得します誰もがこの問題を解決する方法を知っていますか?

+0

azureで動作している場合、なぜlocalhostとポート44313がありますか?このポートはAzureファイアウォールで開かれていますか? (サイト構成)? – rmjoia

+0

[Dominick Baier](https://twitter.com/leastprivilege) – rmjoia

+0

@rmjoiaいつでもつぶやくことができます。IssuerUriはいつでも変更できます。それはテスト時のlocalhostですが、問題は発生しません。私は – r3plica

答えて

1

の設定を変更するUseIdentityServerBearerTokenAuthenticationがこれに対する解決策でした。 オプションを次のように更新しました:

DelayLoadMetadata = true, 

すべてが機能し始めました。

関連する問題