zoukankan      html  css  js  c++  java
  • 为Asp.Net Web Api添加Http基本认证

     Asp.net Web Api提供了RESTFul web服务的编程接口。默认RESTFul 服务没有提供任何验证或者基于角色的验证,这显然不适合Put、Post、Delete这些操作。Aps.net MVC提供了认证过滤器,结合Http基本认证,可以很好的实现RESTFul服务的认证。选择Http基本认证有以下几个原因。

    1. Http & RESTFul是无状态的,每次请求都需要认证即需要提供认证消息。将这些信息放在HTTP头部是个不错的选择。
    2. Http基本认证逻辑清晰简单,配合HTTP响应码(401等)可以提供一个完整的认证逻辑。
    3. 配合部署Https,Http基本认证一样可以获得很高的安全性。
    4. 实现简单。

    实现并测试认证过程需要在服务器端和客户端共同进行。两者均使用了Http Authorization字段,在服务器端读取该字段,获取认证信息;在客户端写入该字段,设置认证信息。

    1.  Web Api端(服务器)

    Http基本认证只需要添加新的认证过滤属性。该属性类继承自 System.Web.Http.AuthorizeAttribute,在 IsAuthorized(...)方法中读取Http 头部Authorization字段及其值,进行自定义验证。

        /// <summary>
        /// 基本用户认证过滤器
        /// </summary>
        public class HttpBasicAuthAttribute : System.Web.Http.AuthorizeAttribute
        {
    
            public override void OnAuthorization(HttpActionContext actionContext)
            {
                base.OnAuthorization(actionContext);
            }
    
            protected override bool IsAuthorized(HttpActionContext actionContext)
            {
                d.WriteLine($"{actionContext.Request.Headers}");
                var headers = actionContext.Request.Headers;
                if (headers.Authorization == null)
                    return false;
    
                var auth = headers.Authorization;
                d.WriteLine($"auth type={auth.Scheme},Parameter={auth.Parameter}");
                //auth.schema is Basic type, auth.Parameter is Base64 encoded string.
                //do user auth() here ...
                return true;
            }     
        }

    在App_Start/WebApiConfig.cs中添加该认证过滤器。

    public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
                // 将 Web API 配置为仅使用不记名令牌身份验证。
                config.SuppressDefaultHostAuthentication();
                config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
                config.Filters.Add(new HttpBasicAuthAttribute());
        }

     2. Client

    使用HttpWebRequest类构造自定义Http请求,写入头部Authorization字段的认证信息——使用了Basic认证,账号密码格式为"账号:密码"的Base64编码串。

           public void PostToWes()
            {           
           request.Method
    = @"Post"; request.ContentType = @"application/json"; request.ContentLength = json.Length; request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequired; var base64 = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes($"test001:123456")); request.Headers["Authorization"] = $"Basic {base64}"; var data = ASCIIEncoding.ASCII.GetBytes(json); using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } }

    Http基本认证在头部相当于明文传递了账号密码,如果觉得不太安全,最简单的方法就是使用Https了。

    参考
    1. Http 基本认证, https://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%8
    2. Https配置, https://support.microsoft.com/zh-cn/kb/324069
    3. RESST, https://zh.wikipedia.org/wiki/REST
  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/jjseen/p/5434174.html
Copyright © 2011-2022 走看看