2017-08-24 81 views
0

我想了解cookie身份驗證,特別是對於ASP.NET Core。據我所知,Cookie認證通常如何工作的是,會話ID存儲在服務器端以及客戶端。在發出請求時,會話ID將被髮送,並會在服務器端進行檢查。ASP.NET Core如何知道Cookie在cookie身份驗證中有效?

我試圖cookie認證中間件在ASP.NET核心使用此代碼如下:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme, 
    AutomaticAuthenticate = true 
}); 

而在的AccountController,在根據日誌:

var myUser = GetUser(email, password); 
var claims = new List<Claim> 
{ 
    new Claim(ClaimTypes.Name, myUser.Name) 
}; 
var props = new AuthenticationProperties 
{ 
    IsPersistent = persistCookie, 
    ExpiresUtc = DateTime.UtcNow.AddYears(1) 
}; 

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); 
await HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), props); 

我看到一個cookie是在瀏覽器,但是這存儲在服務器端?我以爲我需要將它存儲在數據庫中以檢查是否有效,但似乎它已經存儲在某處,因爲我還沒有完成任何數據庫代碼。另外,ASP.NET Core如何知道傳遞的cookie是有效的?

+2

Cookie根本沒有存儲在服務器上。服務器只是解碼瀏覽器發送的內容。 –

+0

@Bart Calixto:服務器如何知道cookie有效? –

+0

不要試圖在技術上100%正確:cookie是使用非公開的「機器密鑰」加密的,只有服務器知道,當客戶端發送cookie時,服務器會嘗試使用機器密鑰進行解碼。如果它不能被解碼,它將被丟棄(又稱無效)。 –

回答

1

在此設置中,服務器上不存儲任何內容。該cookie包含完整的序列化,加密的ClaimsPrincipal和AuthenticationProperties。

有一種參考模式,可以像您所描述的那樣工作,如果身份過大可以使用。在那種情況下,你確實需要建立一個數據存儲。沒有提供默認實現。 https://github.com/aspnet/Security/blob/5b29bced0d2f1cfc78843bcd9ec9a828c6fb5fef/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationOptions.cs#L138

+0

謝謝,那麼服務器如何知道cookie有效?我可能錯過了一些東西,對不起,我不清楚。 –

+0

Cookie認證中間件使用它的私鑰對其進行解密,檢查到期等。 – Tratcher