asp.net Web API - 使用 IdentityServer 和 Autofac 保护 webapi - 无法获取声明



我正试图使用Autofac通过IdentityServer和OpenID Connect保护我的webapi。我正在使用OWIN。但由于某种原因,我无法获得用户的索赔。似乎根本没有触发AccessTokenValidation。这让我觉得我在创业时的申报顺序有问题。这是我的创业公司。

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可用。

我读了很多样本和例子,但仍然没有发现完全相同的情况。我将感谢任何为我指明正确方向的尝试。

谨致问候,Borre

这可能是您将UsageContext注册为Singleton吗?你提到这个类包含声明,所以这个对象应该在pr-http请求后得到解析,不是吗?

原来在AccessTokenValidation-库中有一行神秘的代码不起作用。我用那个图书馆领取索赔。换了线后,一切似乎都正常了。

所以基本上我的问题已经结束了,一切正常。但我仍然不完全相信这是正确的做法。

谢谢约翰的评论!

最新更新