.netコアWeb APIを構築しています。
序文- https://stormpath.com/blog/token-authentication-asp-net-core および https://dev.to/samuelerescaのとおりにトークン認証を実装しました/ developing-token-authentication-using-aspnet-core 。また、githubとここのSOでいくつかの問題を読みました。
これも役に立ちました https://goblincoding.com/2016/07/24/asp-net-core-policy-based-authorisation-using-json-web-tokens/ 。
それをすべて実装した後、何かが足りないように感じています。
簡単なAngularアプリケーションを作成しました。これはWebクライアントに配置されます。認証すると、クライアントにトークンが送信されます。今のところセッションに保存しています(まだ開発中なので、アドレスを指定します)後で保存する場所に関するセキュリティ上の懸念)。
私が見る限りリフレッシュトークンを実装していないので、これ( JWT(JSON Web Token)有効期限の自動延長 )は本当にわかりません。
期待どおりに、ログアウトを呼び出してから再度ログインすると、クライアントに新しいトークンが送信されます。ただし、トークンの有効期限が過ぎて(テストのために1分に設定しました)、ページが更新された場合、トークンはアプリ内で同じままのようです。 つまりトークンの有効期限が切れていないようです!
クライアントが401 Unauthorizedエラーを返すことを期待していたので、ユーザーに再認証を強制することを処理できます。
これはどのように機能するのかではありませんか?バックグラウンドでデフォルトで実行されている自動リフレッシュトークンマジックがあります(まだ設定していません)チュートリアルの明示的な更新トークンの概念)?または、トークン認証の概念について何か不足していますか?
また、-これが永続的に更新されるトークンである場合、トークンが侵害された場合のセキュリティについて心配する必要がありますか?
ご協力いただきありがとうございます
これはJwtBearerOptionsのClockSkewに関係していると思います。
TimeSpan.Zeroに変更します。デフォルトは5分に設定されていると思います(ただし100%確実ではありません)。
Startup.cs => Configureに配置するサンプルコードを以下に投稿しました。
app.UseJwtBearerAuthentication(new JwtBearerOptions()
{
AuthenticationScheme = "Jwt",
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = Configuration["Tokens:Audience"],
ValidIssuer = Configuration["Tokens:Issuer"],
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
}
});
有効期限がデフォルト(5分)または設定した時間をはるかに超えていて、期限切れのトークンが有効であると見なされ、ClockSkew
をTimeSpan.Zero
に設定しても効果がない場合、あなたがプロパティを持っていることを確認してください
ValidateLifetime
私がtrue
に設定したのでfalse
に設定すると問題が発生しますが、これは完全に理にかなっていますが、簡単に見落としました。
services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["JwtToken:Issuer"],
ValidAudience = Configuration["JwtToken:Issuer"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["JwtToken:SecretKey"]))
};
});