Autofacを使用してIdentityServerとOpenID Connectでwebapiを保護しようとしています。私は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アプリケーションから呼び出されます。私は(自分のIDサーバーのエンドポイントを直接呼び出すことによって)アクセストークンが有効であり、利用可能なクレームがあることを確認しました。また、IdentityServer.AccessTokenValidationプロジェクトをダウンロードし、参照として添付しました。そのプロジェクトのメソッドにいくつかのブレークポイントを設定すると、決して呼び出されません。だからこそ私のスタートアップとOWINのパイプラインに何か問題があると思うのです。
起動時にUsageContextを宣言しました。これは、私が実際のコントローラに注入するためのクレームといくつかの構成設定を収集するために使用しているクラスです。これを処理するのが良い方法だと思うので、コントローラには常に有効なUsageContextがあります。
私は多くのサンプルとサンプルを読みましたが、まだまったく同じ状況が見つかりませんでした。私は正しい方向へ私を向けるどんな試みにも感謝します。
よろしく、 ボーア
グローバル認証フィルターを登録したか、AuthorizeでApiControllersを装飾しましたか? –
私はAuthorize-attributeを使用しようとしましたが、それがなくてもグローバル許可フィルタを試していませんでした。コントローラにグローバルフィルタまたは属性を使用して違いがあるかどうかはわかりません。 – Borre
ApiControllerのAuth属性で十分です。 –