リクエストを行ったユーザー以外のユーザーに対して管理コントローラーを介してロールを割り当てたり取り消したりできる方法を探しているときに、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) を使用しています。
これは機能ですか? はいの場合、オフにすることはできますか、それともどこかで間違いを犯しましたか?