我有个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和签名的代码就不写了,这个是我目前应用在生产上的代码,不过还需要改进