HTML5技术

Web API之认证(Authentication)两种实现方式【二】(十三) - Recluse_Xpy

字号+ 作者:H5之家 来源:H5之家 2015-10-09 15:31 我要评论( )

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话。 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现

前言

上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话。

序言

对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,【accepted】方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)或者在Web API里通过使用Web API中的消息处理机制,但是如果我们想应用程序运行在IIS之外此时Windows Idenitity这一方式似乎就不太可能了,同时在Web API中本身就未提供如何处理认证的直接方式,我们不得不自定义来实现认证功能,同时这也是我们所推荐的方式,自己动手,丰衣足食。

温馨提示:下面实现方法皆基于基础认证,若不熟悉Http协议中的Basic基础认证,请先参看此篇文章【园友海鸟-介绍Basic基础认证和Diges摘要认证

 

无论何种方式,对于我们的应用程序我们都需要在业务层使用基于凭证的用户认证,因为是客户端一方的需求,所以客户端需要明确基础验证,基础认证(Basic)非常简单并且支持任何Web客户端,但是基础验证的缺点是不安全,通过使用SSL则可以进行加密就可以在一定程度上保证了安全,如果是对于一般的应用程序通过基础认证只是进行编码而未加密也可以说是安全的。我们还是看看上一节所给图片

通过上述图片的粗略信息我们可以看出在请求到Action方法之间要经过Web API消息处理管道,在请求到目标元素之前要经过HttpMessageHandler和认证过滤器,所以我们可以通过这两者来自定义实现认证。下面我们一一来看。

基于Web API的认证过滤器(AuthorizationFilterAttribute)实现认证 第一步

我们自定义一个认证身份(用户名和密码)的类,那么此类必须也就要继承于 GenericIdentity ,既然是基于基础验证,那么类型当然也就是Basic了。

public class BasicAuthenticationIdentity : GenericIdentity { public string Password { get; set; } public BasicAuthenticationIdentity(string name, string password) : base(name, "Basic") { this.Password = password; } }

第二步

我们要自定义一个认证过滤器特性,并继承 AuthorizationFilterAttribute ,此时会变成如下:

public class BasicAuthenticationFilter : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) {} }

那么在这个重写的方法我们应该写什么呢?我们慢慢来分析!请往下看。

  • 解析请求报文头
  • 首先对于客户单发送过来的请求我们肯定是需要获得请求报头,然后解析请求报头中的Authorization,若此时其参数为空,我们将返回到客户端,并发起质询。

    string authParameter = null; var authValue = actionContext.Request.Headers.Authorization; //actionContext:Action方法请求上下文 ) authParameter = authValue.Parameter; //authparameter:获取请求中经过Base64编码的(用户:密码) if (string.IsNullOrEmpty(authParameter)) return null;

    次之,若此时认证中的参数不为空并开始对其进行编码,并返回一个BasicAuthenticationIdentity对象,若此时对象为空,则同样返回到客户端,并发起质询

    authParameter = Encoding.Default.GetString(Convert.FromBase64String(authParameter)); //对编码的参数进行解码 ); //解码后的参数格式为(用户名:密码)将其进行分割 if (authToken.Length < 2) return null; return new BasicAuthenticationIdentity(authToken[0], authToken[1]); //将分割的用户名和密码传递给此类构造函数进行初始化

    最后,我们将上述两者封装为一个ParseHeader方法以便进行调用 

    public virtual BasicAuthenticationIdentity ParseHeader(HttpActionContext actionContext) { string authParameter = null; var authValue = actionContext.Request.Headers.Authorization; ) authParameter = authValue.Parameter; if (string.IsNullOrEmpty(authParameter)) return null; authParameter = Encoding.Default.GetString(Convert.FromBase64String(authParameter)); ); if (authToken.Length < 2) return null; return new BasicAuthenticationIdentity(authToken[0], authToken[1]); }

  • 接下来我们将认证未通过而需要发起认证质询,我们将其封装为一个方法Challenge
  • void Challenge(HttpActionContext actionContext) { var host = actionContext.Request.RequestUri.DnsSafeHost; actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); actionContext.Response.Headers.Add(, , host)); } 

  • 定义一个方法便于对用户名和密码进行校验,并将其修饰为虚方法,以免后续要添加其他有关用户数据
  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • HTTP认证 - 妙音天女

      HTTP认证 - 妙音天女

      2017-03-27 17:00

    • 数据存储的两种方式:Cookie 和Web Storage - 不羁的少年

      数据存储的两种方式:Cookie 和Web Storage - 不羁的少年

      2017-02-13 17:01

    • 一个简单粗暴的人脸认证标注工具的实现 - 喵耳朵

      一个简单粗暴的人脸认证标注工具的实现 - 喵耳朵

      2017-01-05 11:01

    • 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证 - 微软一站式示

      在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证

      2016-11-20 15:00

    网友点评
    )