0

リクエストを行ったユーザー以外のユーザーに対して管理コントローラーを介してロールを割り当てたり取り消したりできる方法を探しているときに、Claim として保存されている Guid タグが値に一致するかどうかをチェックするカスタム IAuthorizeFilter を実装しました。 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 を使用するのはこれが初めてです。SQL Server 12.0.2000 への既定の接続 (LocalDB) を使用しています。

これは機能ですか? はいの場合、オフにすることはできますか、それともどこかで間違いを犯しましたか?

4

1 に答える 1

0

この問題は、依存性注入を介してサービスを作成する 2 つの異なる方法があるために発生しました。

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

どこで使うべきか

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

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

于 2016-01-05T13:31:07.097 に答える