[ASP.NET]Web API bearer token 验证

本文介绍Visual Studio 2013默认的Web API bearer token 验证


环境:Visual Studio 2013

从 Visual Studio 2013 新增 Web API 项目,如下,

image

默认使用 bearer token 验证,如下,

image

那我们要如何使用它呢?

在 App_Start 目录的 Statup.Auth.cs 有设定,如下,

image

Path为 apRoot/Token ,Token的时效为 14 天,是否可以走 http (测试方便,上线记得要设 false)。

如果我们要使用默认提供的User,直接就可以使用了。

但如果我们有自已的验证使用者帐密的方式,例如调用其他SSO验证,或是从DB取得数据验证,

那我们可以新增一个 OAuthAuthorizationServerProvider ,或是直接修改范本提供给我们的 ApplicationOAuthProvider 。

为了 Demo 方便,我们直接检查账号如果跟密码相同就算OK。

所以修改 ProvidersApplicationOAuthProvider.cs

1.修改 ValidateClientAuthentication Method,不去 check ClientId,如下,

public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
	context.Validated();
	return Task.FromResult(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 ,测试如下,

image

image

再来就是要用这个 access_token 去取 ValuesController 的数据,

而 token 要在 Header 里,如下,

Authorization:Bearer [刚才的access token]

image

执行后,就可顺利取到 ValuesController 的值,如下,

image

如果没有给 token 的话,会回验证不过,回传401,如下,

image

以上是针对Web API 里面的Token机制跟大家分享,

大家如果有其他的想法,也请分享一下哦! Thanks.