2016-08-02 3 views
0

Я пытаюсь защитить свой webapi с помощью IdentityServer и OpenID Connect с помощью Autofac. Я использую OWIN. Но по какой-то причине я не могу получить претензии к пользователю. Кажется, что AccessTokenValidation не запускается вообще. Это заставляет меня думать, что что-то не так в порядке моих заявлений при моем запуске. Вот мой стартап.Защита webapi с IdentityServer и Autofac - не может получить претензии

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

Я пробовал использовать Authorize-атрибут и без него, но я не пробовал использовать глобальный фильтр авторизации. Я не знаю, есть ли разница с использованием глобального фильтра или атрибута в контроллере. – Borre

+0

Атрибут Auth на вашем ApiController должен быть достаточным. –

ответ

1

Может быть, ваша регистрация UsageContext как Singleton? Вы упомянули, что этот класс содержит претензии, поэтому этот объект должен быть разрешен после запроса http-pr, не так ли?

+0

Он должен, это хорошая точка! Я думаю, что это все еще не имеет отношения к исходной проблеме, поскольку части кода, которые строят UsageContext, никогда не достигаются. – Borre

1

Оказалось, что в AccessTokenValidation обнаружена какая-то таинственная строка - библиотека, которая не работает. Я использую эту библиотеку для получения претензий. После смены линии все, казалось, сработало.

Так что в основном мой вопрос сейчас закрыт, и все работает. Но я все еще не полностью убежден, что это правильный способ сделать это.

Спасибо, John за ваши комментарии!