1. 應用程序狀態選項安全
在ASP.NET5當中,全局的Application對象沒有了,轉而被In Memory Caching所代替,ASPNET5當中有下多種管理狀態的方式:session
HttpContext.Items :它裏面的內容的生命週期是針對每一個request的。它被很好的應用在組件與組件、中間件與中間件的交流之間。例如:app
app.Use(async (context, next) => { context.Items["isVerified"] = true; await next.Invoke(); });async
這樣在另外一個middle ware中你就能夠訪問它,例如:spa
app.Run( async (context) => { await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]); });中間件
Querystring and Post: 這種方式你們應該已經瞭解了,可是這種不安全,要注意CSRF的防範。對象
Cookies接口
Session生命週期
session被做爲一箇中間件來實現的,你能夠經過nuget來安裝, 下面是安裝後的配置:內存
"dependencies": {
"Microsoft.AspNet.Session": "1.0.0-rc1-final",
"Microsoft.Extensions.Caching.Memory": "1.0.0-rc1-final",
}
安裝好後,你也必須在Startup文件裏配置,不然會報錯。 會話創建在IDistributedCache之上,配置內存中的session, 你須要在ConfigureServices裏添加以下代碼:
services.AddCaching();
services.AddSession();
而後在Configure裏面添加以下代碼:
app.UseSession();
一旦你配置好了以後,你能夠在HttpContext裏面引用Session。
實現細節:
Session是基於Cookie來實現的,它的默認名字是:「.AspNet.Session」, 它不可被客戶端訪問,由於它被設置了HttpOnly。
你能夠在配置session的時候更改它的名字,閒置時間,以下:
services.AddSession(options => { options.CookieName = ".AdventureWorks.Session";
options.IdleTimeout = Timespan.FromSeconds(10);});
注意:Session是沒加鎖的,同一時刻有兩個請求想對會話修改時,最晚的修改會覆蓋前面的修改。Session的實現是一個總體,不是與key相關的,若是兩個request修改不一樣的key, 它們也可能被覆蓋.
要使用session,它是經過HttpContext裏的屬性Session來訪問的,它實現ISession接口。
public interface ISession
{
Task LoadAsync();
Task CommitAsync();
bool TryGetValue(string key, out byte[] value);
void Set(string key, byte[] value);
void Remove(string key);
void Clear();
IEnumberable<string> Keys {get;}
}
另外,它有一些擴展方法,以下:
context.Session.SetInt32("key1", 123);
int? val = context.Session.GetInt32("key1");
context.Session.SetString("key2", "value");
string stringVal = context.Session.GetString("Key2");
byte[] result = context.Session.Get("key3");
若是 你要存儲複雜對象,你應用序列化成byte[]來存儲,而後從byte[]裏反序列出對象。
Cache
Configuration