Asp.Net 5 / Identity 3:IdentityDbContext実装における要求のキャッシュ

asp.net asp.net-core asp.net-identity-3 c# entity-framework-core

質問

要求を行うユーザー以外のユーザーのために管理者コントローラーを介して役割を割り当てたり取り消したりできる方法を探している間、私はカスタムIAuthorizeFilterを実装して、Claimとして保存されたGuidタグがUserClaimsのEntity Framework 7 Code First Identityテーブル。

Essentialsは、このコードです:

public class RefreshUserClaimsFilterAttribute : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext context)
    {
        var User = context.HttpContext.User;
        var dbContext = context.HttpContext.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        var stampFromClaims = User.Claims.FirstOrDefault(Claim => Claim.Type == "ClaimsStamp")?.Value;
        var stampFromDb = dbContext.UserClaims.Where(UserClaim => UserClaim.UserId == User.GetUserId()).ToList().FirstOrDefault(UserClaim => UserClaim.ClaimType == "ClaimsStamp")?.ClaimValue; 
        // Update claims via RefreshSignIn if necessary
    }
}

var stampFromDb割り当てる行に問題があります。次のように読みやすくなります。

var stampFromDb = dbContext.UserClaims.FirstOrDefault(UserClaim => UserClaim.UserId == User.GetUserId() && UserClaim.ClaimType == "ClaimsStamp")?.ClaimValue;

しかし、キャッシュされた結果(User.Identityの実際のクレームと同じ値)が得られ、これに関するドキュメントが見つかりませんでした。私の最高の推測は、エラーは私の側のどこかにあることですが、私は前にそのような問題に遭遇したことはありません。 Asp.Net 5とEF7を初めて使用しています。私はデフォルトの接続(LocalDB)をSQL Server 12.0.2000に使用しています。

これは機能ですか?はいの場合は電源を切ることができますか、どこかで間違いを犯しましたか?

受け入れられた回答

この問題は、依存関係注入を介してサービスを作成する2つの異なる方法があるために発生しました。私の質問のサンプルコードは

var dbContext = context.HttpContext.ApplicationServices.GetRequiredService<ApplicationDbContext>();

どこで使うべきか

var dbContext = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();

ここでの違いは、 ApplicationServicesRequestServicesです。 ApplicationServicesインジェクタには、データベースクエリの代わりにキャッシュされたデータを返すように、DbSetを以前に埋め込んだデータベースコンテキストのインスタンスがどこかにあるようです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ