三 Web API 受权方式android
web api的客户端,包括 android,ios,h5,天然对访问权限要加上受权机制。对于h5,要求把h5站点和web api部署在同一个域名下,而后对web api 配置为禁止跨域访问。而对 android 和 ios 等app端访问,则参考微信的签名验证方式,在请求url后面加上ios
时间戳,随机字符串,以及加密后的签名。下面主要就app端受权实现代码说明一下。web
1 首先 定义一个 KEY,随便本身定义,我这里直接取一个guid,你能够存放在数据库,也能够存config文件,也能够直接在代码里 const定义。我这里放在config。数据库
<appSettings> <add key="AppKey" value="254d-4eaa-85f4-a92ff4c08042" /> </appSettings>
2 实现一个特性类,继承自.net自带的AuthorizationFilterAttribute。api
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class ApiAuthFilterAttribute : AuthorizationFilterAttribute { 。。。。 }
AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)的意思 很容易理解,即当前访问受权验证能够用在整个controller(class),也能够用在某个web api(method)上。
这个类里面,重点是重载 OnAuthorization方法。方法里的actionContext参数是一个微软针对api请求的作了一些封装改进的一个请求上下文,里面包含了api 请求参数等信息,惋惜缺少我想要的header里的参数。
咱们和app端约定把受权相关参数放在header里面,还有后面一些有关api版本的参数等都放在header里,放在header里安全性更高一些,并且对于app端封装http请求也更简单。为了从actionContext获得普通的HttpContext对象,
转换代码:HttpRequestBase request = (actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase).Request;
public override void OnAuthorization(HttpActionContext actionContext) { base.OnAuthorization(actionContext); // 容许匿名访问 if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count > 0) { return; } HttpRequestBase request = (actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase).Request;
拿到了request,能够经过跨域
string signature = request.Headers["signature"]; string timestamp = request.Headers["timestamp"];
string nonce = request.Headers["nonce"];
result = CheckSignature(signature, timestamp, nonce);
进行受权验证安全
对于须要进行受权的web api
[HttpGet] [ApiAuthFilter] public ApiResult GetShopQRCodeList() { 。。。 }
3 对于用户身份识别,咱们使用了token机制。即用户登陆成功后分配一个token(采用guid)给到客户端。当客户端在请求的header里携带了token时,咱们就能够根据token识别当前请求的用户。在数据库里设计了token表,记录用户登陆时间,登陆设备(h5,app,微信公众号等),token值等,至关于cookie,用于控制用户免密码登陆,以及能够同时登陆几种设备等。微信