【问题标题】:Protecting webapi with IdentityServer and Autofac - can't get claims使用 IdentityServer 和 Autofac 保护 webapi - 无法获得声明
【发布时间】:2016-12-07 07:34:17
【问题描述】:

我正在尝试使用 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);
        });
    }

我正在使用混合流,并且从 SPA 应用程序调用 api。我已经验证(通过直接调用我的身份服务器的端点)访问令牌是有效的并且有可用的声明。我还下载了 IdentityServer.AccessTokenValidation 项目并将其作为参考附加。当我为该项目中的方法设置一些断点时,它们永远不会被调用。这就是为什么我认为我的启动和 OWIN 管道有问题。

我在启动时声明了 UsageContext。这是我用来收集声明和一些配置设置的类 - 将被注入到实际的控制器中。我认为这是处理这个问题的好方法,所以在控制器中总是有有效的 UsageContext 可用。

我已经阅读了很多示例和示例,但仍然没有找到完全相同的情况。我将不胜感激任何为我指明正确方向的尝试。

问候, 博雷

【问题讨论】:

  • 您是否注册了全局授权过滤器或使用 Authorize 修饰了您的 ApiControllers?
  • 我尝试过使用 Authorize-attribute 并且没有它,但我没有尝试过全局授权过滤器。不知道在控制器中使用全局过滤器或者属性有什么区别。
  • ApiController 上的 Auth 属性应该足够了。
  • 您可以调试并看到您的 ClaimsPrincipal 有 0 个声明,或者只是没有您期望的声明..?或者它根本就不是 ClaimsPrincipal?
  • 它根本没有声明。我有支票,但我很确定也没有 ClaimsPrincipal。我的启动中的代码创建了它。

标签: asp.net-web-api owin autofac identityserver3


【解决方案1】:

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

【讨论】:

  • 应该,这很好!我认为它仍然与原始问题无关,因为从未达到构建 UsageContext 的部分代码。
【解决方案2】:

原来 AccessTokenValidation 库中有一些神秘的行不起作用。我使用该库来获取索赔。换线后,一切似乎都奏效了。

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

感谢约翰的 cmets!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2016-09-26
    • 1970-01-01
    • 2021-03-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多