我有一個oauth2資源服務器,它使用JwtBearerMiddleware
來驗證訪問令牌。現在我不希望安全印記發生變化時訪問令牌無效。因爲它看起來像這個中間件不會自己驗證安全印章。jwtBearerMiddleware中的安全戳驗證程序
我發現SecurityStampValidator
類似乎只驗證cookie身份驗證。
我在哪裏以及如何從我的json Web令牌驗證安全印章?
我目前的方式做到這一點的是當我註冊JwtBearerMiddleware
以註冊OnTokenValidated
事件的事件處理程序。在這個事件處理程序中,我簡單地查詢數據庫中的安全聲明並將其與令牌中的聲明進行比較。當安全戳不相同時,我只需將上下文的Ticket
和SecurityToken
設置爲null
,並跳到下一個中間件,如果需要身份驗證,它將最終拋出401 http狀態碼。
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
...
Events = new JwtBearerEvents
{
OnTokenValidated = async (ctx) =>
{
var securityStampClaim = ctx.Ticket.Principal.Claims.FirstOrDefault(claim => claim.Type == "AspNet.Identity.SecurityStamp");
var subjectClaim = ctx.Ticket.Principal.Claims.FirstOrDefault(claim => claim.Type == OpenIdConnectConstants.Claims.Subject);
if (securityStampClaim == null || subjectClaim == null)
return;
var user = await userStore.FindByIdAsync(subjectClaim.Value, ctx.HttpContext.RequestAborted);
if (user?.SecurityStamp == securityStampClaim.Value)
return;
ctx.SecurityToken = null;
ctx.Ticket = null;
ctx.SkipToNextMiddleware();
}
}
});
這是應該怎麼做?
爲什麼asp身份證在理賠原則中存儲安全戳呢? 並且用每個驗證郵票的請求來訪問數據庫效率不高嗎? –