本文介紹Visual Studio 2013預設的Web API bearer token 驗證
環境:Visual Studio 2013
從 Visual Studio 2013 新增 Web API 專案,如下,
預設使用 bearer token 驗證,如下,
那我們要如何使用它呢?
在 App_Start 目錄的 Statup.Auth.cs 有設定,如下,
Path為 apRoot/Token ,Token的時效為 14 天,是否可以走 http (測試方便,上線記得要設 false)。
如果我們要使用預設提供的User,直接就可以使用了。
但如果我們有自已的驗證使用者帳密的方式,例如呼叫其他SSO驗證,或是從DB取得資料驗證,
那我們可以新增一個 OAuthAuthorizationServerProvider ,或是直接修改範本提供給我們的 ApplicationOAuthProvider 。
為了 Demo 方便,我們直接檢查帳號如果跟密碼相同就算OK。
所以修改 Providers\ApplicationOAuthProvider.cs
1.修改 ValidateClientAuthentication Method,不去 check ClientId,如下,
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return Task.FromResult<object>(null);
}
2.修改 GrantResourceOwnerCredentials Method,帳號是 rainmaker 相同就算OK,如下,
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
if (context.UserName.ToLower()!="rainmaker")
{
context.Rejected();
return;
}
var id = new ClaimsIdentity(context.Options.AuthenticationType);
//可以用ClaimTypes 來加入一些定義好的 Claim 如,Name, Role 等等
id.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
id.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
context.Validated(id);
context.Request.Context.Authentication.SignIn(id);
context.Validated(id);
context.Request.Context.Authentication.SignIn(id);
}
然後執行起來後,就可以用 Fiddler 來測試,給它帳密,取回Token。
Request Body的值給(最後請不要按Enter,換行哦!)
grant_type=password&username=rainmaker&password=rainmaker
我測試的站台是 http://localhost:11446/ ,所以取 token 的URL就是 http://localhost:11446/token ,測試如下,
再來就是要用這個 access_token 去取 ValuesController 的資料,
而 token 要在 Header 裡,如下,
Authorization:Bearer [剛才的access token]
執行後,就可順利取到 ValuesController 的值,如下,
如果沒有給 token 的話,會回驗證不過,回傳401,如下,
以上是針對Web API 裡面的Token機制跟大家分享,
大家如果有其他的想法,也請分享一下哦! Thanks.
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^