2016-08-02 74 views
0

我正在嘗試使用Autofac保護我的webapi使用IdentityServer和OpenID Connect。我正在使用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應用程序調用。我已經驗證(通過直接調用我的身份服務器的端點)訪問令牌有效,並且有可用的聲明。我還下載了IdentityServer.AccessTokenValidation項目並將其作爲參考。當我爲該項目中的方法設置一些斷點時,它們永遠不會被調用。這就是爲什麼我認爲我的啓動和OWIN管道有問題。

我在啓動時聲明瞭UsageContext。這是我正在用來收集索賠和一些配置設置的類 - 將其注入實際控制器。我認爲這將是處理這個問題的好方法,所以在控制器中總有效的UsageContext可用。

我讀過很多樣本和例子,但仍然沒有找到完全相同的情況。我會感謝任何嘗試將我指向正確的方向。

問候, 博雷

+0

您是否註冊了全球授權過濾器或使用授權來修飾您的ApiControllers? –

+0

我已經嘗試使用授權屬性,沒有它,但我沒有嘗試全球授權過濾器。我不知道在控制器中使用全局過濾器或屬性是否有任何區別。 – Borre

+0

您的ApiController上的Auth屬性應該足夠了。 –

回答

1

難道是你的UsageContext作爲一個Singleton註冊?你提到這個類包含聲明,所以這個對象應該解決一次pr http請求 - 不是嗎?

+0

它應該,這是好點!我認爲它仍然與原始問題沒有關係,因爲構建UsageContext的代碼部分永遠不會到達。 – Borre

1

事實證明,AccessTokenValidation中有一些神祕的行 - 庫不起作用。我使用該庫來獲得索賠。改變線後,一切似乎工作。

所以基本上我的問題現在關閉,東西的作品。但我仍然不完全相信這是做到這一點的正確方法。

謝謝John的評論!

相關問題