c# - 認証 - アクセストークン チェック




.NET Web API:異なるユーザーに異なるRefresh Token Expiration時間を設定する (2)

私はIdentity Server 3を使用して、角クライアントのアクセス/リフレッシュトークンを認証して生成しています。

私は現在Refresh TokenがAngular Clientのために48時間で期限切れになるように設定しています。

Angularアプリケーションを使用する一部のユーザーは、資格情報を再入力せずに100日間サインオンする必要があります。クライアント全体ではなく、特定のユーザーに対してのみ更新トークンの有効期限を設定できますか?

私のデータベースには100人のユーザーがいますが、1人の特定のユーザーのみを100日間で再認証する必要はなく、残りは48時間ごとに認証する必要があります。

次の行に沿った何か:

if (user == "Super Man") {
    AbsoluteRefreshTokenLifetime = TimeSpan.FromDays(100.0).Seconds,
}

達成することは可能ですか? または、クライアント全体の更新トークンの有効期限の設定だけに制限されていますか?

ありがとうございました


考慮事項

たとえば、スライドセッションを検討してください。 スライドセッションでは、ユーザーが行ったすべての認証済みアクションで新しい短命トークンを送信します。 ユーザがアクティブである限り、彼は認証されたままになります (例えばトークン管理実装が必要ですが、有効期限が切れる前にユーザインタラクションが必要です)。 ユーザーが有効期限の切れたトークンを送信すると、彼はしばらくの間非アクティブだったことを意味します。

JWTの仕組みを見てみましょう:

JWTは、主に以下の場合に適しています。

  • JWTをAPIトークンとして使用することで、 サーバー間またはクライアント/サーバー間 (モバイルアプリやシングルページアプリ(SPA)など)の通信をサポートする必要のあるAPIサービスを構築する場合、非常に賢いアイデアです限られた範囲でリクエストを頻繁に作成する必要があります。通常、認証データは、ユーザーデータにあまり依存せずにステートレスな方法で永続化できます。
  • あなたが3人以上の関係者を必要とするあらゆるタイプのサービスを構築しているなら、JWTも役に立つかもしれません。
  • ユーザー連盟(シングルサインオンやOpenID Connectなど)を使用している場合は、JWTが重要になります。なぜなら、第三者を介してユーザーの身元を確認する方法が必要なためです。

セッショントークンとしてjwtsを使用して停止するともっと明確になります

セッションではJWTを使用しないでくださいほとんどの場合、セッショントークンとしてJWTを使用することは悪い考えです。

考えられる解決策

JWTをリフレッシュするために、 JWTリフレッシュトークンと.NET Coreが独自のコードを実装するのに便利です.JWT(JSON Web Token)内での説明の有効期限の自動延長により 、実際のシナリオを設計できます。 操作をリフレッシュする前に、必要なユーザーを検査する必要があります。

私は別の実装をASP.NET Core 2.0とJSON Webトークン使用してHandle Refresh Tokenで見つけました。多分役に立つかもしれません。


私はIdentityServer3を使ったことは一度もありませんでしたが、私は以下のコードをテストしませんでしたが、このコンセプトはうまくいくと思います。

IdentityServer3のコードを見ると、 DefaultRefreshTokenService.CreateRefreshTokenAsyncで寿命が設定されていることがわかります。

int lifetime;
if (client.RefreshTokenExpiration == TokenExpiration.Absolute)
{
    Logger.Debug("Setting an absolute lifetime: " + client.AbsoluteRefreshTokenLifetime);
    lifetime = client.AbsoluteRefreshTokenLifetime;
}
else
{
    Logger.Debug("Setting a sliding lifetime: " + client.SlidingRefreshTokenLifetime);
    lifetime = client.SlidingRefreshTokenLifetime;
}

コアコードを変更する必要はありませんが、独自の実装でIRefreshTokenServiceをオーバーライドすることができます。

例としてCustomUserServiceサンプルからコードを取得すると、次のようになります。

internal class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/core", coreApp =>
        {
            var factory = new IdentityServerServiceFactory()
                .UseInMemoryClients(Clients.Get())
                .UseInMemoryScopes(Scopes.Get());

            var refreshTokenService = new MyDefaultRefreshTokenService();

            // note: for the sample this registration is a singletone (not what you want in production probably)
            factory.RefreshTokenService = new Registration<IrefreshTokenService>(resolver => refreshTokenService);

MyDefaultRefreshTokenServiceは、DefaultRefreshTokenServiceのコピーです。

コンパイルするには、IdentityModel(v1.13.1)のNuGetパッケージを追加し、次のクラスを追加します。

using System;

namespace IdentityServer3.Core.Extensions
{
    internal static class DateTimeOffsetHelper
    {
        internal static Func<DateTimeOffset> UtcNowFunc = () => DateTimeOffset.UtcNow;

        internal static DateTimeOffset UtcNow
        {
            get
            {
                return UtcNowFunc();
            }
        }

        internal static int GetLifetimeInSeconds(this DateTimeOffset creationTime)
        {
            return (int)(UtcNow - creationTime).TotalSeconds;
        }
    }
}

現在、イベントに関するコンパイルエラーがあります。 コードをテストするためにイベントを削除することができます。 それが機能する場合は、いつでも追加することができます。

そして今、ユーザーごとにRefreshTokenLifetimeを実装します。 RefreshTokenServiceのバージョンでは、クライアントコードを削除し、独自のロジックを使用してユーザーあたりの有効期間を判断できます。

すでに十分な情報が含まれているかどうかはわかりませんが、件名は利用可能です。 しかし、それができれば、あなたはuserManagerにアクセスして、店から生涯を読むことができます。 または、代替情報を使用して生涯情報を渡すこともできます(おそらく、生涯価値を含む申し立てを使用できます)。

繰り返しますが、私はこれをテストしませんでしたが、コンセプトはうまくいくと思います。





identityserver3