[解決済み] ASP.NET Core 2.0認証ミドルウェア
質問
Core 1.1 で @blowdart さんのアドバイスに従い、カスタムミドルウェアを実装しました。
https://stackoverflow.com/a/31465227/29821
このように動作しました。
- ミドルウェアが実行されました。リクエストヘッダからトークンを拾いました。
- トークンを検証し、有効であれば複数のクレームを含むアイデンティティ(ClaimsIdentity)を構築し、HttpContext.User.AddIdentity()で追加しました。
- ConfigureServicesでservices.AddAuthorizationを使って、ミドルウェアが提供するクレームを要求するためのポリシーを追加しています。
- コントローラ/アクションでは、[Authorize(Roles = "ミドルウェアが追加した何らかのロール")]を使用することになりますね。
トークンが有効でなく (上記のステップ 2)、クレームが追加されなかった場合、"No authenticationScheme was specified, and there was no DefaultChallengeScheme found." となることを除いて、これは 2.0 である程度動作します。
ということは、2.0でauthが変わったと読み取れます。
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
ASP.NET Core 2.0で同じことをするための正しい道は何でしょうか?本当にカスタム認証を行うための例が見当たりません。
どのように解決するのですか?
長い間この問題を解決しようとしてきた結果、Microsoft が core 2.0 の新しい単一ミドルウェア設定のためにカスタム認証ハンドラを作成することをどのように望んでいるかがようやくわかりました。
MSDN のドキュメントに目を通した後、次のようなクラスを見つけました。
AuthenticationHandler<TOption>
というクラスがあり、これは
IAuthenticationHandler
インターフェイスを実装しています。
そこから、既存の認証スキームがあるコードベース全体が https://github.com/aspnet/Security
これらのうちの1つの内部では、MicrosoftがJwtBearer認証スキームをどのように実装しているかが示されています。( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
このコードのほとんどを新しいフォルダにコピーし、そして
JwtBearer
.
では
JwtBearerHandler
クラス (これは
AuthenticationHandler<>
を拡張したもの) のオーバーライドがあります。
Task<AuthenticateResult> HandleAuthenticateAsync()
カスタムトークンサーバを使用してクレームを設定するための古いミドルウェアを追加しましたが、パーミッションに関するいくつかの問題が発生し、単に
200 OK
の代わりに
401 Unauthorized
の代わりに、トークンが無効でクレームが設定されていない場合に使用します。
をオーバーライドしていたことに気づきました。
Task HandleChallengeAsync(AuthenticationProperties properties)
これは、何らかの理由で
[Authorize(Roles="")]
を介してパーミッションを設定するために使用されます。
このオーバーライドを削除した後、コードは動作し、正常に
401
をスローしていました。
ここから得られる主な情報は、今はカスタムミドルウェアを使うことができないので、それを実装するために
AuthenticationHandler<>
で実装しなければならず、また
DefaultAuthenticateScheme
と
DefaultChallengeScheme
を使用する場合
services.AddAuthentication(...)
.
これはすべてどのように見えるかの例です。
Startup.cs / ConfigureServices() に追加します。
services.AddAuthentication(options =>
{
// the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
options.DefaultAuthenticateScheme = "Custom Scheme";
options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });
Startup.cs / Configure()に追加します。
app.UseAuthentication();
新規ファイルCustomAuthExtensions.csを作成します。
public static class CustomAuthExtensions
{
public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
{
return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
}
}
新規ファイル CustomAuthOptions.cs を作成します。
public class CustomAuthOptions: AuthenticationSchemeOptions
{
public CustomAuthOptions()
{
}
}
新規ファイル CustomAuthHandler.cs を作成します。
internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
// store custom services here...
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
return AuthenticateResult.NoResult();
}
}
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】C#で四捨五入する方法
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] Gitのプッシュで "Authentication Failed "と表示される
-
[解決済み】ASP.net Core WebAPIでCORSを有効にする方法
-
[解決済み] 偽造防止用トークンの問題
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み] 2つのリストを結合する
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] ASP.NET CoreでカスタムのAuthorizeAttributeを作成する方法は?