使用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可用。
我读过很多样本和例子,但仍然没有找到完全相同的情况。我会感谢任何尝试将我指向正确的方向。
问候, 博雷
难道是你的UsageContext
作为一个Singleton注册?你提到这个类包含声明,所以这个对象应该解决一次pr http请求 - 不是吗?
它应该,这是好点!我认为它仍然与原始问题没有关系,因为构建UsageContext的代码部分永远不会到达。 – Borre
事实证明,AccessTokenValidation中有一些神秘的行 - 库不起作用。我使用该库来获得索赔。改变线后,一切似乎工作。
所以基本上我的问题现在关闭,东西的作品。但我仍然不完全相信这是做到这一点的正确方法。
谢谢John的评论!
您是否注册了全球授权过滤器或使用授权来修饰您的ApiControllers? –
我已经尝试使用授权属性,没有它,但我没有尝试全球授权过滤器。我不知道在控制器中使用全局过滤器或属性是否有任何区别。 – Borre
您的ApiController上的Auth属性应该足够了。 –