Я пытаюсь защитить свой 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.
Я читал много примеров и примеров, но до сих пор не нашел точно такой же ситуации. Буду признателен за любые попытки указать мне в правильном направлении.
С уважением, Борре
Вы зарегистрированы как глобальный фильтр авторизации или украшен ваш ApiControllers авторизацией? –
Я пробовал использовать Authorize-атрибут и без него, но я не пробовал использовать глобальный фильтр авторизации. Я не знаю, есть ли разница с использованием глобального фильтра или атрибута в контроллере. – Borre
Атрибут Auth на вашем ApiController должен быть достаточным. –