web-dev-qa-db-ja.com

新しい認証スキームを動的に追加する

認証/承認に関する議論/決定を行うために、ASP.Net Core 2PoCを構築しています。

私は現在、このアプリケーションがサポートしたい新しいOpenIDプロバイダーをユーザーが定義したところです。

これをサポートする1​​つの方法は、起動時に構成済みのプロバイダーをすべて読み取り、それらをすべてConfigureServices内で構成することです。しかし、アプリを強制終了して再起動しなくてもこれを実行できるという興味深い手がかりがあります。

IAuthenticationSchemeProviderには、理想的に見えるAddSchemeメソッドがあります。今私がする必要があるのはAuthenticationSchemeオブジェクトを構築することだけで、私は金色です。コンストラクターAuthenticationScheme(string name, string displayName, Type handlerType)がありますが、Microsoft.AspNetCore.Authentication.OpenIdConnectの型を正しく使用してこのオブジェクトを正しく構築し、OpenIDConnect固有のオプションを指定できるようにする方法がわかりません。

3番目のパラメーターに使用したいタイプはOpenIdConnectHandlerだと思います。しかし、私は自分のオプションで何をしますか? (または、代わりに、Action<OpenIdConnectOptions>デリゲートを提供できるのと同等の方法を実行するにはどうすればよいですか)


私は このgithubの問題 これも興味深い(TryAddSchemeメソッドがないため、例外が発生する可能性があり、このPoCをさらに説得することを選択した場合、抽象的に興味深い)が、小さなサンプルではオプションについてはまったく話しません。

11

ここにこれを行う方法の例があります- https://github.com/aspnet/AuthSamples/tree/master/samples/DynamicSchemes

OAuthスキームの場合、schemeProvider.AddSchemeoptionsCache.TryAddを呼び出すだけでなく、さらに多くのことを行う必要があることに注意してください。を介してオプションを追加する場合は、「構成後」の手順もあります通常のメソッドです。クラスは次のとおりです--- https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication.OAuth/OAuthPostConfigureOptions.cs

したがって、タイプOAuthPostConfigureOptions<OAuthOptions, OAuthHandler<OAuthOptions>>をDIコンテナーに登録し、コンストラクターを介してそれを取得し、オプションをoptionsCacheに追加する前に、オプションでOAuthPostConfigureOptions.PostConfigureを呼び出すことができます。

8
Nick

上記の回答を拡張するには( https://stackoverflow.com/a/49825151/220069 )、schemeProvider.AddSchemeとoptionsCache.TryAddに加えて https:// github .com/aspnet/AspNetCore/blob/release/2.2/src/Security/samples/DynamicSchemes/Controllers/AuthController.cs 、Startup.csとAuthController.csにさらに変更を加える必要があります。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    // register to the DI container so it can be injected in the AuthController constructor.
    services.AddSingleton<OpenIdConnectPostConfigureOptions>();
    ...
}

AuthController.cs内

AuthControllerコンストラクターにOpenIdConnectPostConfigureOptionsを挿入します。

public AuthController(IAuthenticationSchemeProvider schemeProvider, 
    IOptionsMonitorCache<OpenIdConnectOptions> optionsCache,
    OpenIdConnectPostConfigureOptions postConfigureOptions)
{
    _schemeProvider = schemeProvider;
    _optionsCache = optionsCache;
    _postConfigureOptions = postConfigureOptions;
}

authController.csのAddOrUpdateメソッドで、OpenIdConnectOptionsクラスのインスタンスを作成し、構成後の手順でこれを使用します。

var options = new OpenIdConnectOptions
{
    Authority = "xxx-endpoint",
    CallbackPath = "/signin-oidc",
    ClientId = "XXX",
    ClientSecret = "XXX",
    ......
};
_postConfigureOptions.PostConfigure("oidc", options);                
_optionsCache.TryAdd("oidc", options);
2
Suketu Bhuta