2016-08-02 7 views
0

Autofacを使用してIdentityServerとOpenID Connectでwebapiを保護しようとしています。私はOWINを使用しています。しかし何らかの理由で私はユーザーの主張を得ることができません。 AccessTokenValidationはまったく起動されていないようです。それは私のスタートアップ時の宣言の順番に何か間違っていると思う。ここに私のスタートアップがあります。IdentityServerとAutofacでwebapiを保護する - 要求を受け取ることができません

public class Startup { 

    public void Configuration(IAppBuilder appBuilder) { 

     // Add authentication 
     this.AddAuthentication(appBuilder); 

     HttpConfiguration config = new HttpConfiguration(); 
     var container = CreateAutofacContainer(); 

     var resolver = new AutofacWebApiDependencyResolver(container); 
     config.DependencyResolver = resolver; 
     WebApiConfig.Register(config); 
     config.EnsureInitialized(); 

     // Register config - you can't add anything to pipeline after this 
     appBuilder.UseAutofacMiddleware(container); 
     appBuilder.UseAutofacWebApi(config); 
     appBuilder.UseWebApi(config);  
    } 

    private static IContainer CreateAutofacContainer() { 

     var autofacBuilder = new ContainerBuilder(); 

     var assembly = Assembly.GetExecutingAssembly(); 

     // Register your Web API controllers. 
     autofacBuilder.RegisterApiControllers(assembly); 

     // For general logging implementation 
     autofacBuilder.RegisterType<ConsoleLogger>().As<ILogger>(); 

     // Create empty usage context to be filled in OWIN pipeline 
     IUsageContext usageContext = new RuntimeUsageContext(); 
     autofacBuilder.RegisterInstance(usageContext).As<IUsageContext>().SingleInstance(); 

     // We need to get usage context builded 
     autofacBuilder.RegisterType<OIDCUsageContextProvider>().InstancePerRequest(); 

     var container = autofacBuilder.Build(); 
     return container; 
    } 

    private void AddAuthentication(IAppBuilder app) { 

     var options = new IdentityServerBearerTokenAuthenticationOptions(); 

     options.Authority = "MYAUTHORITY"; 
     options.RequiredScopes = new[] { "openid", "profile", "email", "api" }; 
     options.ValidationMode = ValidationMode.ValidationEndpoint; 
     app.UseIdentityServerBearerTokenAuthentication(options); 

     // Add local claims if needed 
     app.UseClaimsTransformation(incoming => { 

      // either add claims to incoming, or create new principal 
      var appPrincipal = new ClaimsPrincipal(incoming); 
      // incoming.Identities.First().AddClaim(new Claim("appSpecific", "some_value")); 

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

私はハイブリッドフローを使用しています.APIはSPAアプリケーションから呼び出されます。私は(自分のIDサーバーのエンドポイントを直接呼び出すことによって)アクセストークンが有効であり、利用可能なクレームがあることを確認しました。また、IdentityServer.AccessTokenValidationプロジェクトをダウンロードし、参照として添付しました。そのプロジェクトのメソッドにいくつかのブレークポイントを設定すると、決して呼び出されません。だからこそ私のスタートアップとOWINのパイプラインに何か問題があると思うのです。

起動時にUsageContextを宣言しました。これは、私が実際のコントローラに注入するためのクレームといくつかの構成設定を収集するために使用しているクラスです。これを処理するのが良い方法だと思うので、コントローラには常に有効なUsageContextがあります。

私は多くのサンプルとサンプルを読みましたが、まだまったく同じ状況が見つかりませんでした。私は正しい方向へ私を向けるどんな試みにも感謝します。

よろしく、 ボーア

+0

グローバル認証フィルターを登録したか、AuthorizeでApiControllersを装飾しましたか? –

+0

私はAuthorize-attributeを使用しようとしましたが、それがなくてもグローバル許可フィルタを試していませんでした。コントローラにグローバルフィルタまたは属性を使用して違いがあるかどうかはわかりません。 – Borre

+0

ApiControllerのAuth属性で十分です。 –

答えて

1

は、それはシングルトンとしてUsageContextのご登録だろうか?あなたはこのクラスにはクレームが含まれていると言われていますので、このオブジェクトは一度httpリクエストを解決する必要があります。

+0

これは良い点です!私は、UsageContextを構築するコードの部分に決して到達しないので、元の問題との関連性はまだないと思います。 – Borre

1

AccessTokenValidationに不思議な行があることが判明しました。これは動作しませんでした。私はそのライブラリを使ってクレームを得る。行を変更した後、すべてがうまくいくように見えました。

だから、基本的に私の質問は今閉じられているし、ものが動作します。しかし、私はこれがこれを行う正しい方法だと完全には確信していません。

ありがとうございました。

関連する問題