当前位置: 代码迷 >> Web Service >> web api 认证的有关问题
  详细解决方案

web api 认证的有关问题

热度:158   发布时间:2016-05-02 02:16:16.0
web api 认证的问题
我有个webapi的服务,不想让人知道地址就能随便调用,请问应该怎么做?
看过一些教材了,基本认证、digest认证、集成windows认证都只适合于局域网,forms认证必须设置cookie(因为调用的客户端里有不能用cookie的情况)
oauth2貌似需要第三方的认证服务,我不需要这么复杂的。

我想要的其实很简单,假设webapi服务的地址是:http://xxxx.com/api/customer,那么客户端在调用时要带个字符串去调用webapi服务,如果字符串和在服务器上设置的字符串一致就可以调用服务,否则提示未授权,请问这样要怎么才能实现?
------解决思路----------------------
public class BaseAuthenticationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            //获取Asp.Net对应的Request
            var Request = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request;
            NameValueCollection collection = null;
            switch (Request.RequestType.ToUpper())
            {
                case "GET":
                    collection = Request.QueryString;
                    break;
                case "POST":
                    collection = Request.Form;
                    break;
                case "PUT":
                case "DELETE":
                default:
                    break;
            }
            if (collection != null && collection.Count > 0
                && !string.IsNullOrWhiteSpace(collection["partner"])//必须包含partner
                && !string.IsNullOrWhiteSpace(collection["sign"])//必须包含sign
                && Regex.IsMatch(collection["sign"], "^[0-9A-Za-z]{32}$"))//sign必须为32位Md5摘要
            {
                string partnerKey = this.GetPartnerKey(collection["partner"]);
                if (!string.IsNullOrWhiteSpace(partnerKey))
                {
                    string sign = collection.GetSign(collection["partner"], partnerKey);//对数据进行签名
                    if (string.Equals(sign, collection["sign"], StringComparison.OrdinalIgnoreCase))
                    {
                        base.OnActionExecuting(actionContext);
                        return;
                    }
                }
            }
            actionContext.Response =
                actionContext.Request.CreateResponse(HttpStatusCode.OK, ResponseEnum.Unauthorized.CreateResponse());
        }

        /// <summary>
        /// 获取Partner对应的Key
        /// </summary>
        /// <param name="partner"></param>
        /// <returns></returns>
        private string GetPartnerKey(string partner)
        {
            var partnerInfo = PartnerHelper.GetPartnerInfo(partner);
            return partnerInfo == null ? null : partnerInfo.PartnerKey;
        }
    }

如何构造Partner和签名的代码就不写了,这个是我目前应用在生产上的代码,不过还需要改进
  相关解决方案