摘要

对第三方开放的接口,处于安全的考虑需要对其进行安全认证,是否是合法的请求。目前在项目中也遇到这种情况,提供的接口因为涉及到客户铭感数据,所以在调用的时候,不能直接暴露,需要有一个认证的机制。所以对接口安全认证的方式,进行了调研,这里提供一个自定义安全认证的Filter例子。

一个例子

在mvc中,如果需要对某个页面如果用户不登录则无法访问,我们的做法可能是校验session或者使用特性[Authorize]

    [Authorize]
public class UserController : Controller
{
// GET: User
public ActionResult Index()
{
//if (Session["user"]==null)
//{
// return RedirectToAction("login");
//}
return View();
}
}

在mvc中,这种认证方式基于windows或者form认证。但在提供web api给移动端app调用的时候,windows或者form认证就不太合适了。但我们可以自定义一种filter对当前访问的用户进行认证。

自定义Filter特性

    /// <summary>
/// 基于http basic认证
/// </summary>
public class CustomerBasicAuthrizeAttribute : AuthorizationFilterAttribute
{
//重写OnAuthorization 方法 public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//如果action带有允许匿名访问的特性,则直接返回,不再进行安全认证
if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
{
return;
}
if (actionContext.Request.Headers.Authorization != null)
{
if (actionContext.Request.Headers.Authorization.Scheme != "Basic")
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new HttpException("no token"));
}
else
{
string base64Para = actionContext.Request.Headers.Authorization.Parameter;
//解码base64字符串
byte[] buffer = Convert.FromBase64String(base64Para);
string decodeBase64 = Encoding.UTF8.GetString(buffer);
if (!string.IsNullOrEmpty(decodeBase64))
{
string[] paras = decodeBase64.Split(':');
if (paras.Length > )
{
string userName = paras[];
string pwd = paras[];
if (userName == "wolfy" && pwd == "")
{
}
else
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new HttpException("userName or pwd is error."));
}
}
else
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new HttpException("no token"));
} }
else
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new HttpException("no token"));
}
} }
else
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new HttpException("no Authorization header"));
} base.OnAuthorization(actionContext);
}
}

使用postman测试

认证成功

第三方调用的时候,可以为其生成一对appname和appsecret放在供客户端进行使用。客户端使用的时候在请求头的Authorization中添加base64字符串就可以了。对于basic对应的值,是base64字符串,如果感觉还不安全可以尝试使用SSL方式。

SSL协议详解

[Asp.Net web api]基于自定义Filter的安全认证的更多相关文章

  1. ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...

  2. [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...

  3. ASP.NET Web API教程(六) 安全与身份认证

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  4. 【转】ASP.NET WEB API系列教程

    from: 西瓜小强 http://www.cnblogs.com/risk/category/406988.html ASP.NET Web API教程(六) 安全与身份认证 摘要: 在实际的项目应 ...

  5. ASP.NET Web API 应用教程(一) ——数据流使用

    相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容. 主要内容如下: I  数据 ...

  6. 对一个前端AngularJS,后端OData,ASP.NET Web API案例的理解

    依然chsakell,他写了一篇前端AngularJS,后端OData,ASP.NET Web API的Demo,关于OData在ASP.NET Web API中的正删改查没有什么特别之处,但在前端调 ...

  7. 在ASP.NET Web API中使用OData的Action和Function

    本篇体验OData的Action和Function功能.上下文信息参考"ASP.NET Web API基于OData的增删改查,以及处理实体间关系".在本文之前,我存在的疑惑包括: ...

  8. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  9. 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)

    一些小的C/S项目(winform.WPF等),因需要访问操作数据库,但又不能把DB连接配置在客户端上,原因有很多,可能是DB连接无法直接访问,或客户端不想安装各种DB访问组件,或DB连接不想暴露在客 ...

随机推荐

  1. Docker容器跨主机通信之:直接路由方式

    一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...

  2. 20155225 2016-2017-2 《Java程序设计》第一周学习总结

    20155225 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 JVM(java virtual machine)就是java虚拟机,我的理解就是编译运行j ...

  3. Knockout.Js官网学习(模版绑定)

    模板绑定器 如今页面结构越来越复杂,仅仅依靠foreach已经不足以我们的使用,这个时候我们就需要模板的存在,模板的优点自然很多,首先会让页面整洁,同时修改起来也可以方面的定位,最重要的是ko可以条件 ...

  4. Python创建ES索引

    # pip install elasticsearch from datetime import datetime from elasticsearch import Elasticsearch es ...

  5. 21 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. C++: class Solution { private: stack<int> dataStack ; stac ...

  6. AutoCompleteTextView,Spinner,消息提示

    package com.example.wang.testapp2; import android.app.Notification; import android.app.NotificationM ...

  7. Singleton 多线程

    单例模式 何为单例模式,在GOF的<设计模式:可复用面向对象软件的基础>中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点.首先,需要保证一个类只有一个实例:在类中,要构造 ...

  8. 【LOJ】#2059. 「TJOI / HEOI2016」字符串

    题解 我们冷静一下,先画一棵后缀树 然后发现我们要给c和d这一段区间在[a,b]这一段开头的串里找lcp 而lcp呢,就是c点的祖先的到根的一段,假如这个祖先的子树里有[a,b - dis[u] + ...

  9. 【AtCoder】ARC094(C-F)题解

    C - Same Integers 题解 要么三个都达到最大的数,要么三个都到达最大的数+1,判断是前一种情况的方法是不断垫高前两大的,看之后最小的那个和最大的那个差值是不是2的倍数 否则就是第二种情 ...

  10. bzoj 1233

    先要了解一个结论,在多种可行的堆叠方案中,至少有一种能使层数最高的方案同时使得底边最短.即底边最短的,层数一定最高. dp[ i ] = min(sum[j - 1] - sum[i - 1])  j ...