• 为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
  • 相关阅读:
    UML系列图--用例图
    扩展方法
    POJ3254 Corn Fields(状压DP)
    POJ2836 Rectangular Covering(状压DP)
    POJ2817 WordStack(状压DP)
    POJ2441 Arrange the Bulls(状压DP)
    HDU2167 Pebbles(状压DP)
    HDU1561 The more, The Better(树形DP)
    POJ3659 Cell Phone Network(树上最小支配集:树型DP)
    UVa10917 A Walk Through the Forest(SPFA+记忆化搜索)
  • 原文地址:https://www.cnblogs.com/jjseen/p/5434174.html
Copyright © 2020-2023  润新知