使用IdentityServer和Autofac保护webapi - 无法获得声明

问题描述:

我正在尝试使用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属性应该足够了。 –

难道是你的UsageContext作为一个Singleton注册?你提到这个类包含声明,所以这个对象应该解决一次pr http请求 - 不是吗?

+0

它应该,这是好点!我认为它仍然与原始问题没有关系,因为构建UsageContext的代码部分永远不会到达。 – Borre

事实证明,AccessTokenValidation中有一些神秘的行 - 库不起作用。我使用该库来获得索赔。改变线后,一切似乎工作。

所以基本上我的问题现在关闭,东西的作品。但我仍然不完全相信这是做到这一点的正确方法。

谢谢John的评论!