最近,在整理3S比賽
項(xiàng)目代碼的時(shí)候人乓,和老師討論到數(shù)據(jù)庫(kù)安全的問題勤篮,之前寫的WebApi服務(wù)是沒有加任何驗(yàn)證的,也就是說色罚,任何人只要知道了接口的url碰缔,都能夠模擬http請(qǐng)求去訪問我們的服務(wù)接口,在該項(xiàng)目中僅僅寫了get
方法戳护,可以匿名獲取到數(shù)據(jù)金抡。再加上put
、deleta
腌且、post
方法即可去增刪改查數(shù)據(jù)庫(kù)梗肝,在實(shí)際項(xiàng)目的應(yīng)用過程中是不可取的。
由于之前3S
項(xiàng)目的數(shù)據(jù)都是模擬數(shù)據(jù)铺董,不是工業(yè)現(xiàn)場(chǎng)的真實(shí)數(shù)據(jù)巫击,寫一個(gè)簡(jiǎn)單的演示demo其WebApi不加任何驗(yàn)證也沒什么不妥,不過最近實(shí)驗(yàn)室要給山西的氧化鋁工廠做一個(gè)生產(chǎn)過程移動(dòng)監(jiān)控的APP,設(shè)計(jì)到工業(yè)數(shù)據(jù)的安全性問題坝锰,需要解決WebApi的身份驗(yàn)證問題粹懒。經(jīng)過簡(jiǎn)單的了解學(xué)習(xí),Asp.Net Identity
的引入為Asp.Net應(yīng)用程序提供了一套統(tǒng)一的身份驗(yàn)證機(jī)制顷级。
認(rèn)證流程
這是一張Identity官方教程的圖崎淳,認(rèn)證的流程如下:
1.用戶在客戶端中輸入賬戶和密碼;
2.客戶端將賬戶密碼發(fā)送到授權(quán)服務(wù)器中愕把;
3.授權(quán)服務(wù)器根據(jù)用戶信息來生成一個(gè)token
拣凹;
4.客戶端在http請(qǐng)求頭中攜帶token
訪問受限資源.
創(chuàng)建解決方案
1.使用Visual Studio(博主用的是VS2013)創(chuàng)建一個(gè)WebApi項(xiàng)目;
2.更改身份驗(yàn)證恨豁,選擇“個(gè)人用戶賬戶”嚣镜。
如果此時(shí)不進(jìn)行身份注冊(cè)認(rèn)證直接采用匿名方式模擬http請(qǐng)求去訪問我們的服務(wù)接口,發(fā)現(xiàn)是無法訪問的橘蜜。
注冊(cè)用戶
默認(rèn)的 WebApi 模板中菊匿,已經(jīng)為我們創(chuàng)建了一些常用的 api 了,比如注冊(cè):
獲取Token
使用剛剛注冊(cè)好的賬戶和密碼计福,發(fā)出如下請(qǐng)求:
返回請(qǐng)求的內(nèi)容:
{
"access_token": "c_-F2k8exhBRc3FV8WQvU6ga796TXOSZhHDNn9-JzDYeTbJ3Zctf3AGXd53yoQdNoruJPetMqqQOKzyqR1t3YSplLxreDiQgNCCueZ5AsGP7PVLvaBe3s_5M0FZ8H-0pnLt0mW2QH5sB7DJ7zMuesQJ0q5euvfuK4VuYMkQ1vN_BHr0WHg9M4X7lPVU9D9tbP9M9tjQoyblx4-8_wjjpFYUSlwYgdWDoAQwhRSdWENWtmP2_D3iYPpxqSrrwsdud3XYMPCjMXI-vrcuu_OWDcBPKFBYmu8_Hfo21uC_1G7ZvYq0YhcJSa28lMA4a4dx_1gW1l9SD86VuMv6NbZ5Da5h1X0y2ETO2Pv26U-4Lfs6OjycvwYyBH4Pul5vDMQO0BNVkQaQLxloav6JlNPSCbIdnMssHxNuuP778u5-yddbl58KuL4FI1JdfmSq9_Kg08YjkjfauQKUgu5LBcB778A0mQqyTOMzUdRqz_ZRbw9c",
"token_type": "bearer",
"expires_in": 1209599,
"userName": "1@qq.com",
".issued": "Sat, 02 Jul 2016 06:05:34 GMT",
".expires": "Sat, 16 Jul 2016 06:05:34 GMT"
}
其中跌捆,access_token
, token_type
, expires_in
屬性是 OAuth2
協(xié)議中定義的屬性;其他屬性是可以自定義的象颖,可以在 ApplicationOAuthProvider
的 TokenEndpoint
方法中進(jìn)行自定義操作.
訪問受限制資源
將獲取的的 access_token 值放到 http 的請(qǐng)求中佩厚,生成如下請(qǐng)求,進(jìn)行對(duì)受限資源的訪問:
Webapi的認(rèn)證
StartUp
默認(rèn)的 Startup.Auth.cs
文件中说订,啟用了三種身份認(rèn)證的方式抄瓦,Asp.Net Identity
集成了 Owin
可以使用app.UserXXX
使用所需要的認(rèn)證方式.
- 使用基于 Cookie 的傳統(tǒng)表單驗(yàn)證;
- 使用第三方擴(kuò)展登錄陶冷;
- 使用基于 BearerToken 的登錄方式钙姊,這也是本使用的方式;( BearerToken 與常見的第三方 Oauth 方式類似埂伦,但這是一種不記名的方式煞额,也就是客戶端無需提供 ClientId,ClientSecret)
OAuthBearerTokens
構(gòu)造函數(shù)中 OAuthAuthorizationServerOptions
提供了一下配置:
// 針對(duì)基于 OAuth 的流配置應(yīng)用程序
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
//在生產(chǎn)模式下設(shè) AllowInsecureHttp = false
AllowInsecureHttp = true
};
- 生成 token 的地址為:http://localhost:port/token沾谜;
- 為 token 設(shè)置了失效時(shí)間為14天膊毁,失效后,再次訪問受限的請(qǐng)求時(shí)為得到未授權(quán)的相應(yīng).
關(guān)于Bearer Token
token 是在服務(wù)器上生成类早,并加密媚媒,然后再發(fā)送到客戶端;客戶端訪問受限資源時(shí)需要將 token 發(fā)送到服務(wù)器端涩僻,服務(wù)器端再將 token 進(jìn)行解密缭召;對(duì)于客戶端來說這個(gè) token 是無法被破解的栈顷; 對(duì)于服務(wù)器來說,token 就是一個(gè)用戶的唯一標(biāo)識(shí)符嵌巷,任何人只要擁有了 token萄凤,就能獲取用戶的權(quán)限。
所以對(duì)于安全需求高的場(chǎng)景搪哪,為防止 token 被劫持靡努,請(qǐng)對(duì) api 的請(qǐng)求用 SSL/TSL 對(duì) http 進(jìn)行加密。
Reference
http://blog.wangtuyao.com/post/2014/10/29/working-with-web-api-and-asp-net-identity.html