我正在嘗試使用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可用。
我讀過很多樣本和例子,但仍然沒有找到完全相同的情況。我會感謝任何嘗試將我指向正確的方向。
問候, 博雷
您是否註冊了全球授權過濾器或使用授權來修飾您的ApiControllers? –
我已經嘗試使用授權屬性,沒有它,但我沒有嘗試全球授權過濾器。我不知道在控制器中使用全局過濾器或屬性是否有任何區別。 – Borre
您的ApiController上的Auth屬性應該足夠了。 –