使いやすく、非常に軽量な、ASP.NET Core 用の Microsoft スタイルの基本スキーム認証の実装。
GitHub で見る
.NET Framework 4.6.1 および/または NetStandard 2.0 以降
マルチターゲット: net8.0;ネット7.0;ネット6.0;ネット5.0;ネットコアアプリ3.1;ネットコアアプリ3.0;ネット標準2.0;ネット461
このライブラリは NuGet で公開されています。したがって、コードにカスタム変更を加えずに NuGet パッケージを使用したい場合は、プロジェクトに直接インストールできます。
以下のリンクから直接ダウンロードしてください。古いパッケージは廃止されたため、新しいパッケージをダウンロードすることを検討してください。
新しいパッケージのリンク - AspNetCore.Authentication.Basic。
古いパッケージのリンク - Mihir.AspNetCore.Authentication.Basic。
または、プロジェクトで以下のコマンドを実行します。
PM> Install-Package AspNetCore.Authentication.Basic
サンプルは、samples ディレクトリで入手できます。
設定は非常に簡単です。このライブラリの使用を開始するには、ASP.NET Core 2.0 以降の基本的な作業知識が必要です。
このライブラリを使用して機能するには 2 つの異なる方法があります。必要に応じて、両方の方法を混合できます。
1] IBasicUserValidationServiceの実装の使用
2] Microsoft の認証ライブラリで見られるのと同じアプローチであるBasicOptions.Events (OnValidateCredentials デリゲート) を使用する
注:
SuppressWWWAuthenticateHeader が設定されていない場合は、オプションで Realm を設定する必要があります。
IBasicUserValidationService インターフェイスの実装が使用され、BasicOptions.Events.OnValidateCredentials デリゲートも設定されている場合は、このデリゲートが最初に使用されます。
基本認証を使用する場合は、運用環境で常に HTTPS (SSL 証明書) プロトコルを使用してください。
using AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// SuppressWWWAuthenticateHeader が設定されていない場合は、オプションで Realm を設定する必要があります。// IBasicUserValidationService インターフェイスの実装がオプションと同様に使用される場合.Events.OnValidateCredentials デリゲートも設定されている場合、このデリゲートが使用されますfirst.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// 型パラメータのない以下の AddBasic では、options.Events.OnValidateCredentials デリゲートを設定する必要があります。//.AddBasic(options => { options.Realm = "My App"; }) ;// type パラメータを指定した以下の AddBasic は、BasicUserValidationService を依存関係コンテナに追加します。 .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddControllers();//// デフォルトでは、ASP.NET Core のデフォルトの意図であるすべての要求に対して認証は要求されませんbehaviour.//// したがって、すべてのリクエストの認証にチャレンジするには、以下の FallbackPolicy オプションを使用してください。//services.AddAuthorization(options =>//{// options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseHttpsRedirection();// 以下のパイプライン チェーンの順序は次のとおりです。重要!app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
using AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// SuppressWWWAuthenticateHeader が設定されていない場合は、オプションで Realm を設定する必要があります。// IBasicUserValidationService インターフェイスの実装がオプションと同様に使用される場合.Events.OnValidateCredentials デリゲートも設定されている場合、このデリゲートが使用されますfirst.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// 型パラメータのない以下の AddBasic では、options.Events.OnValidateCredentials デリゲートを設定する必要があります。//.AddBasic(options => { options.Realm = "My App"; }) ;// 以下の AddBasic と type パラメーターは、BasicUserValidationService を依存関係コンテナーに追加します。 .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// デフォルトでは、ASP.NET Core のデフォルトの意図であるすべての要求に対して認証は要求されませんbehaviour.//// したがって、すべてのリクエストの認証にチャレンジするには、上記の services.AddMvc() の代わりに以下のオプションを使用してください。//services.AddMvc(options => //// options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseAuthentication( );app.UseMvc();}}
AspNetCore.Authentication.Basic を使用します;パブリック クラス BasicUserValidationService : IBasicUserValidationService{プライベート読み取り専用 ILogger<BasicUserValidationService> _logger;プライベート読み取り専用 IUserRepository _userRepository;パブリック BasicUserValidationService(ILogger<BasicUserValidationService> ロガー、IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}public async Task<bool> IsValidAsync(string username, string password){try{// 注: この実装は使用しないでください。これはデモ目的のみです// ここに実装を記述し、検証に応じて true または false を返します。var user = await _userRepository.GetUserByUsername(username);var isValid = user != null && user.Password == パスワード;return isValid;}catch (Exception e){_logger.LogError(e, e.Message);throw;}}}
SuppressWWWAuthenticateHeader が true に設定されていない場合は、設定する必要があります。これは、認証されていないリクエストに挑戦するときに WWW-Authenticate 応答ヘッダーとともに使用されます。
デフォルト値は false です。
true に設定すると、認証されていない要求にチャレンジするときに WWW-Authenticate 応答ヘッダーは返されません。
false に設定すると、未認証のリクエストにチャレンジするときに WWW-Authenticate レスポンス ヘッダーが返されます。
デフォルト値は false です。
true に設定すると、エンドポイントのコントローラー アクションまたはメタデータに AllowAnonymous フィルターがあるかどうかをチェックし、見つかった場合はリクエストの認証を試行しません。
基本認証ミドルウェアによって発生したイベントを処理するためにアプリケーションによって提供されるオブジェクト。
アプリケーションはインターフェイスを完全に実装することも、BasicEvents のインスタンスを作成して、処理するイベントにのみデリゲートを割り当てることもできます。
このプロパティに割り当てられたデリゲートは、資格情報を検証する直前に呼び出されます。
認証を行うには、このプロパティにデリゲートを提供する必要があります。
デリゲートでは、 context.Principal プロパティが割り当てられるユーザーの詳細から認証クレーム プリンシパルの構築を処理する context.ValidationSucceeded() を呼び出して context.Success() を呼び出すか、ユーザーから認証クレーム プリンシパルを構築する必要があります。詳細を確認して context.Principal プロパティに割り当て、最後に context.Success() メソッドを呼び出します。
context.Success() メソッドを呼び出さずに context.Principal プロパティのみを設定した場合、 Success() メソッドが自動的に呼び出されます。
このプロパティに割り当てられたデリゲートは、認証が成功すると呼び出されます。 OnValidateCredentials デリゲートが割り当てられている場合は呼び出されません。
応答にクレームやヘッダーなどを追加するために使用できます。
このプロパティに割り当てられたデリゲートは、ライブラリ内で予期しない例外がスローされたときに呼び出されます。
このプロパティに割り当てられたデリゲートは、不正な応答を処理するときに呼び出し元にチャレンジが送り返される前に呼び出されます。
これは、何をしようとしているのかわかっていて、カスタム実装を使用したい場合にのみ使用してください。 問題の認証スキームがリクエスト フローの一部として認証対話を処理する場合、401 チャレンジの問題に対処するようにデリゲートを設定します。 (応答ヘッダーを追加したり、ログイン ページまたは外部サインイン場所の 401 結果を 302 に変更したりするなど)。
最後に context.Handled() を呼び出して、このチャレンジのデフォルト ロジックをスキップします。
承認が失敗し、Forbidden 応答が返された場合、このプロパティに割り当てられたデリゲートが呼び出されます。
これは、何をしようとしているのかわかっていて、カスタム実装を使用したい場合にのみ使用してください。
Forbid を処理するようにデリゲートを設定します。
最後に context.Handled() を呼び出して、デフォルトのロジックをスキップします。
ASP.NET Core では、既定では、すべての要求に対して認証が要求されません。したがって、要求で必要な基本認証の詳細を渡さなくても、 BasicUserValidationServiceがヒットしなくても心配する必要はありません。これは正常な動作です。 ASP.NET Core は、コントローラー/メソッドを[Authorize]フィルター属性で装飾するか、その他の手段によって、認証を行うように具体的に指示された場合にのみ、認証にチャレンジします。
ただし、使用しているものに応じて、デフォルトですべてのリクエストに認証を要求するようにしたい場合は、 StartupクラスのConfigureServicesメソッドに以下のオプション行を追加できます。
// ASP.NET Core 3.0 以降ではservices.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// OR// ASP.NET Core 2.0 以降ではservices.AddMvc (options => {options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
MVC を使用していないが、ASP.NET Core 3.0 以降のエンドポイントを使用している場合は、以下に示すように、 StartupクラスのConfigureメソッドの下にあるエンドポイント マップにチェーン メソッド.RequireAuthorization()
を追加できます。
// ASP.NET Core 3.0 以降app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");}).RequireAuthorization(); / / ここに注意してください!!!!
ASP.NET Core は、このライブラリでもサポートされている複数の認証スキームの追加をサポートしています。スキーム名をパラメータとして受け取る拡張メソッドを使用するだけです。残りはすべて同じです。これはさまざまな方法で実現できます。以下は簡単な大まかな例です。
スキーム名のパラメータには任意の文字列を指定できることに注意してください。
public void ConfigureServices(IServiceCollection services){services.AddTransient<IUserRepository, InMemoryUserRepository>();services.AddAuthentication("Scheme1").AddBasic<BasicUserValidationService>("Scheme1", options => { options.Realm = "My App"; }).AddBasic<BasicUserValidationService_2>("Scheme2", options => { options.Realm = "My App"; }).AddBasic("Scheme3", options => { options.Realm = "私のアプリ"; options.Events = new BasicEvents{OnValidateCredentials = async (context) =>{var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var user = await userRepository.GetUserByUsername(context.Username);var isValid = user ! = null && user.Password == context.Password;if (isValid){context.Response.Headers.Add("ValidationCustomHeader", "From OnValidateCredentials");varclaim = new[]{new Claim("CustomClaimType", "カスタム クレーム値 - OnValidateCredentials から") };context.ValidationSucceeded(クレーム); // クレームはオプションです}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Scheme3").RequireAuthenticatedUser().Build();});}
バージョン | 注意事項 |
---|---|
8.0.0 |
|
7.0.0 |
|
6.0.1 |
|
5.1.0 |
|
5.0.0 |
|
3.1.1 |
|
3.1.0 |
|
2.2.0 |
|
RFC 7617: HTTP Basic の技術仕様
ASP.NET Core セキュリティ ドキュメント
アスプネット/セキュリティ
MITライセンス