HTML5技术

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

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

public class BasicAuthenticationHandler : DelegatingHandler{ authenticationHeader = ; protected override TaskHttpResponseMessage SendAsync(HttpRequestMessage request, CancellationToken cancellationTo

public class BasicAuthenticationHandler : DelegatingHandler { authenticationHeader = ; protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var crendentials = ParseHeader(request); if (crendentials != null) { var identity = new BasicAuthenticationIdentity(crendentials.Name, crendentials.Password); var principal = new GenericPrincipal(identity, null); Thread.CurrentPrincipal = principal; //针对于ASP.NET设置 //if (HttpContext.Current != null) // HttpContext.Current.User = principal; } return base.SendAsync(request, cancellationToken).ContinueWith(task => { var response = task.Result; if (crendentials == null && response.StatusCode == HttpStatusCode.Unauthorized) { Challenge(request, response); } return response; }); } void Challenge(HttpRequestMessage request,HttpResponseMessage response) { var host = request.RequestUri.DnsSafeHost; response.Headers.Add(authenticationHeader, , host)); } public virtual BasicAuthenticationIdentity ParseHeader(HttpRequestMessage requestMessage) { string authParameter = null; var authValue = requestMessage.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]); } }

第三步 

上述我们自定义的BasicAuthenticationFilter此时就得继承 AuthorizeAttribute 该特性也是继承于上述的 AuthorizationFilterAttribute ,我们需要利用AuthorizeAttribute中的 IsAuthorized 方法来验证当前线程中的Principal是否已经被授权。

public class BasicAuthenticationFilter : AuthorizeAttribute { IsAuthorized(HttpActionContext actionContext) { var identity = Thread.CurrentPrincipal.Identity; if (identity != null && HttpContext.Current != null) identity = HttpContext.Current.User.Identity; if (identity != null && identity.IsAuthenticated) { var basicAuthIdentity = identity as BasicAuthenticationIdentity;
//可以添加其他需要的业务逻辑验证代码
&& basicAuthIdentity.Password == ) { return true; } } return false; } }

通过 IsAuthorized 方法返回值来看,若为false,则返回401状态码,此时会触发 BasicAuthenticationHandler  中的质询,并且此方法里面主要是我们需要添加认证用户的业务逻辑代码。同时我们也说过我们第一种方法自定义实现的过滤器特性是 AuthorizationFilterAttribute (如果我们有更多逻辑使用这个特性是个不错的选择),而在这里是 AuthorizeAttribute (对于验证用户并且返回bool值使用此过滤器特性是个不错的选择)。

第四步

注册自定义管道以及认证过滤器特性

config.MessageHandlers.Add(new BasicAuthenticationHandler()); config.Filters.Add(new BasicAuthenticationFilter());

最后一步

[BasicAuthenticationFilter] public class ProductController : ApiController {.....}

下面我们通过【360极速浏览器】来验收成果。点击按钮直接请求控制器

接下来取消,是否返回401

 

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

网友点评
5