asp.net web api添加自定义认证

1、定义认证失败结果生成器

   /// <summary>
    /// 认证失败结果生成器
    /// </summary>
    public class AuthenticationFailureResult : IHttpActionResult
    {
        public AuthenticationFailureResult(string reasonPhrase, HttpRequestMessage request)
        {
            ReasonPhrase = reasonPhrase;
            Request = request;
        }

        public string ReasonPhrase { get; private set; }

        public HttpRequestMessage Request { get; private set; }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            return Task.FromResult(Execute());
        }

        private HttpResponseMessage Execute()
        {
            return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, this.ReasonPhrase);
        }
    }

2、定义自定义认证过滤器(基于Cookie)

/// <summary>
    /// 自定义认证
    /// </summary>
    public class CustomAuthenticationFilter : Attribute, IAuthenticationFilter
    {
        public virtual bool AllowMultiple
        {
            get { return false; }
        }

        public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
        {
            var principal = await this.AuthenticateAsync(context.Request);
            if (principal == null)
            {
                context.Request.Headers.GetCookies().Clear();
                context.ErrorResult = new AuthenticationFailureResult("未授权请求", context.Request);
            }
            else
            {
                context.Principal = principal;
            }
        }

        public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
        {
            return Task.FromResult(0);
        }

        private Task<IPrincipal> AuthenticateAsync(HttpRequestMessage request)
        {
            return Task.Run<IPrincipal>(() =>
                {
                    CookieHeaderValue cookieMobile = request.Headers.GetCookies("clientMobile").FirstOrDefault(),
                        cookieToken = request.Headers.GetCookies("clientToken").FirstOrDefault();
                    if (cookieMobile == null || cookieToken == null
                        || string.IsNullOrWhiteSpace(cookieMobile["clientMobile"].Value)
                        || string.IsNullOrWhiteSpace(cookieToken["clientToken"].Value))
                    {
                        return null;
                    }

                    string mobile = cookieMobile["clientMobile"].Value,
                        token = cookieToken["clientToken"].Value;
                    ClientDTO client = null;            //此处从Redis服务器中取出指定用户,各位可以根据需要自行更换
                    using (ICache cache = ObjectContainer.Current.Resolve<ICacheFactory>().CreateCache())
                    {
                        client = cache.Get<ClientDTO>(RedisTables.CLIENT, mobile);
                    }            //验证用户合法性,如果合法,构建声明式安全主题权限模式并返回,若用户验证不通过返回空
                    if (client != null && string.Equals(token, Md5Helper.MD5(string.Format("{0}{1}", mobile, client.MsgCode), 32), StringComparison.Ordinal))
                    {
                        IEnumerable<Claim> claims = new List<Claim>()
                        {
                            new Claim(ClaimTypes.Name, mobile)
                        };
                        var identity = new ClaimsIdentity("LoanCookie");
                        identity.AddClaims(claims);
                        return new ClaimsPrincipal(identity);
                    }

                    return null;
                });
        }
    }

3、将认证特性标记应用于全局、控制器或控制器操作,以控制器操作为例:

时间: 2024-12-09 16:49:41

asp.net web api添加自定义认证的相关文章

ASP.NET Web API安全认证

http://www.cnblogs.com/n-pei/archive/2012/05/29/2524673.html 一.IIS/AsP.NET认正 1.Basic认证 2.Digest认证 3.集成windows认证 二.SSL/TLS 1.非对称加密 2.通过 ssL/TLs实 现传输安全 3.ssL/TLs的 应用  三.第三方认证 1.0Auth2.0简 介 2.Implicit Authorization Grant  3.Authorizauon Code AuthorizaHo

ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认证. 系列文章列表 ASP.NET Web API(一):使用初探,GET和POST数据ASP.NET Web API(二):安全验证之使用HTTP基本认证ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication) 摘要认证原理 在基本认证的方式中,主

Angularjs 通过asp.net web api认证登录

Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity,membership实现居于数据库的用户名/密码的认证登录 环境 Vs.net 2013 Asp.net mvc + web api Individual user accounts Angularjs Underscore 新建一个asp.net mvc+ web api project 注册一个test用户用于测试 新建一个用于登录验证用户名密码

ASP.NET Web API(二):安全验证之使用HTTP基本认证

在前一篇文章ASP.NET Web API(一):使用初探,GET和POST数据中,我们初步接触了微软的REST API: Web API. 我们在接触了Web API的后就立马发现了有安全验证的需求,所以这篇文章我们先来讨论下安全验证一个最简单的方法:使用HTTP基本认证. HTTP基本认证原理 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器

ASP.NET Web API 简介

ASP.NET Web API 简介 ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RESTful 服务的理想平台. ASP.NET Web API 特性 ASP.NET Web API 包含下列特性: 先进的 HTTP 编程模型: 使用新的强类型的 HTTP 对象模型直接操作 HTTP 请求和响应, 在 HTTP客户端使用相同的编程模型和 HTTP

ASP.NET Web API 特性

1.先进的 HTTP 编程模型: 使用新的强类型的 HTTP 对象模型直接操作 HTTP 请求和响应, 在 HTTP客户端使用相同的编程模型和 HTTP 管道: 2.支持路由: Web API 完整支持 ASP.NET 路由, 包括路由参数和约束. 此外, 到动作的映射支持约定, 从此将不再需要向类或者方法添加类似于 [HttpPost] 之类的属性: 3.内容协商: 客户端与服务端可以一起决定 API 返回数据的格式. 默认支持 XML, JSON 以及 Form URL-Encoded 格式

ASP.NET Web API 2基于令牌的身份验证

基于令牌的认证 我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户. WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几个好处:可扩展性.松散耦合.移动终端调用比较简单等等,别人都用上了,你还有理由不用吗? 下面我们花个20分钟的时间来实现一个简单的WEB API token认证: Step 1: 新建一个空的WEB API项目,项目名称就设置为

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

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,[accepted]方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)或者在Web API里通过使用Web API中的消息处理机制,但是如果我们想应用程序运行在IIS之外此时Win

新作《ASP.NET Web API 2框架揭秘》开始全面接受预订

我觉得大部分人都是"眼球动物",他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个"生态系统"比喻成海面上漂浮的冰山,我们所能看的到的只是露出水面的冰山一角,水面之下才是一个"庞然大物". 提到服务,我们自然想到Web Service.但是传统意义上的Web Service却有点名不副实,因为支撑它的其实不是Web而是SOAP,承载