[Web API]以Attribute加上Header验证

1 篇文章 0 订阅
0 篇文章 0 订阅

建立新FilterAttribute继承AuthorizationFilterAttribute,覆写OnAuthorization拦截传入的HttpActionContext内容判断是否有传入指定的资料

public override void OnAuthorization(HttpActionContext filterContext)
{
    var identity = FetchAuthHeader(filterContext); //取得資料內容
    if (identity == null)
    {
        ChallengeAuthRequest(filterContext); //回傳錯誤訊息
        return;
    }
    var genericPrincipal = new GenericPrincipal(identity, null);
    //針對目前連線的使用者做授權 
    Thread.CurrentPrincipal = genericPrincipal;
    if (!OnAuthorizeUser(identity.Name, identity.Password, filterContext)) //驗證
    {
        ChallengeAuthRequest(filterContext);
        return;
    }
    base.OnAuthorization(filterContext);
}

解析HttpActionContext内容取得指定的资料

protected virtual BasicAuthenticationIdentity FetchAuthHeader(HttpActionContext filterContext)
{
    string customer = "";
    string pwd = "";
    IEnumerable<string> authRequest = filterContext.Request.Headers.GetValues("指定的資料名稱");
    IEnumerable<string> authRequest2 = filterContext.Request.Headers.GetValues("指定的資料名稱2");
    try
    {
        customer = authRequest.FirstOrDefault();
        pwd = authRequest2.FirstOrDefault();
    }
    catch { }
    return new BasicAuthenticationIdentity(customer, pwd);
}

验证解析出来的资料是否符合需求

protected override bool OnAuthorizeUser(string username, string password, HttpActionContext actionContext)
{
    if (username == "驗證資料" && password == "驗證碼")
        return true;
    return false;
}

建立验证失败时要回传的讯息

private static void ChallengeAuthRequest(HttpActionContext filterContext)
{
    var dnsHost = filterContext.Request.RequestUri.DnsSafeHost;
    filterContext.Response = filterContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
    filterContext.Response.Headers.Add("WWW-Authenticate", string.Format("validate failed", dnsHost));
}

于WebApiConfig.cs中注册新增的Filter

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        GlobalConfiguration.Configuration.Filters.Add(new WebApi.Filters.ApiAuthenticationFilter());
    }
}

最后在需要验证的API加上该Filter即可

[WebApi.Filters.ApiAuthenticationFilter]
public object QueryApi(string pInput)
{ 
    return null; 
}

转载自:AlenWu的程式学习笔记

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值