Authentication for the REST APIs

HTTP基本认证原理

在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。

其基本的实现方式是:

客户端在用户输入用户名及密码后,将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中,如当用户名为Parry,密码为123456时,客户端将用户名和密码用":"合并,并将合并后的字符串用BASE64加密,并于每次请求数据时,将密文附加于请求头(Request Header)中。

HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

摘自:http://www.cnblogs.com/parry/archive/2012/11/09/ASPNET_MVC_Web_API_HTTP_Basic_Authorize.html

继承System.Web.Http.AuthorizeAttribute

 public class HTTPBasicAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
    {
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (actionContext.Request.Headers.Authorization != null)
            {
                string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));

                if (string.Equals(userInfo, string.Format("{0}:{1}", "admin", "aadmin")))
                {
                    IsAuthorized(actionContext);
                }
                else
                {
                    HandleUnauthorizedRequest(actionContext);
                }
            }
            else
            {
                HandleUnauthorizedRequest(actionContext);
            }
        }
        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
            throw new System.Web.Http.HttpResponseException(challengeMessage);
        }
    }

客户端2种不同方式调用:
  public static string GetPersonsByRequest()
        {
            try
            {
                var userName = "admin";
                var passWord = "aadmin";
                string url = "http://localhost:4067/api/persons";
                string ResultJson = "";
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Method = "GET";//设置请求方式
                request.ContentType = "application/x-www-form-urlencoded";
                //request.ContentType = "text/xml; charset=utf-8";//设置返回xml
                request.Credentials = CredentialCache.DefaultCredentials;
                request.Timeout = 1000 * 1000;//设置超时时间
                //设置户名密码的Base64编码,添加Authorization到HTTP头
                request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", userName, passWord))));
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    System.IO.StreamReader str = new System.IO.StreamReader(responseStream, System.Text.Encoding.GetEncoding("UTF-8"));//设置编码
                    ResultJson = str.ReadToEnd();
                    response.Close();
                    str.Close();
                }
                return ResultJson;
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }
        //推荐使用,需要net4.0以上版本支持
        public static async Task<string> GetPersonsByClient()
        {
            try
            {
                string responseBody = "";
                var userName = "admin";
                var passWord = "aadmin";
                using (HttpClient client = new HttpClient())
                {
                    //绑定请求地址
                    client.BaseAddress = new Uri("http://localhost:4067/");
                    client.DefaultRequestHeaders.Accept.Add(
                        new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                    //设置Http请求验证信息
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                        Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", userName, passWord))));
                    using (HttpResponseMessage response = client.GetAsync("api/persons").Result)
                    {
                        if (response.IsSuccessStatusCode)//判断响应是否成功!
                        {
                            responseBody = await response.Content.ReadAsStringAsync();
                        }
                    }
                }
                return responseBody;
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }
        private static string RequestResult(TypeMethods tppe)
        {
            string Result = "";
            switch (tppe)
            {
                case TypeMethods.HttpClient:
                    Result = GetPersonsByClient().Result;
                    break;
                case TypeMethods.HttpWebRequest:
                    Result = GetPersonsByRequest();
                    break;
                default:
                    break;
            }
            return Result;

        }
        [Flags]
        public enum TypeMethods
        {
            HttpClient = 1,
            HttpWebRequest = 2,
        }
        static void Main(string[] args)
        {
            string json1 = RequestResult(TypeMethods.HttpClient);
            string json2 = RequestResult(TypeMethods.HttpWebRequest);

        }
    }

 
时间: 2024-11-10 03:55:16

Authentication for the REST APIs的相关文章

&lt;C#&gt;Google Drive APIs

第一步,激活Drive API 首先,注册Google帐号:其次,登录Google Developers Console:接着,建立工程和程序:紧接,激活APIs & auth:最后,选择Credentials. 第二步,安装Google Client Library 安装一个NuGet包(Google.Apis.drive).如在VS2012上,先选择Tools,再NuGet Package Manager,接着Package Manager Console.在PM>中输入Install-

Rancher + K8S RestApi使用

  1前言 1.1使用的软件及版本 软件 版本号 Rancher 1.6stable Kubernetes 1.8.3 Docker 1.12.6 1.2 Rancher与K8S的RESTAPI差异 因为目前使用Rancher作为K8S的部署工具,Rancher封装了K8S的REST API(仅仅是做了一层代理),且K8S apiserver是作为内部服务(没有开放对外端口),因此无法直接访问K8S的api.不过可以通过Rancher开放的端口访问,其他内容还是没有变化的. 原K8S的REST

手工离线部署k8s(v1.9)

1. 环境准备(采用一个master节点+两个node节点)master 192.168.2.40node-1 192.168.2.41node-2 192.168.2.42 绑定hosts 2.将master和node-1.node-2绑定hosts #vi /etc/hosts 192.168.2.40   master192.168.2.41   node-1192.168.2.42   node-2 3. master节点与node节点ssh密码登录 [[email protected]

kubernetes 环境搭建

一.规划1.系统centos 7 2.ip规划及功能分配192.168.2.24 master 192.168.2.24 etcd 192.168.2.25 node1(即minion)192.168.2.26 node2(即minion) 二.基本环境配置1.关闭防火墙#systemctl stop firewalld.service#systemctl disable firewalld.service 2.永久关闭SELinux #vi /etc/selinux/configSELINUX

windows7导入k8s用户证书

通过浏览器访问 需要给浏览器生成一个 client 证书,访问 apiserver 的 6443 https 端口时使用 这里使用部署 kubectl 命令行工具时创建的 admin 证书.私钥和上面的 ca 证书,创建一个浏览器可以使用 PKCS#12/PFX 格式的证书: [[email protected]-node1 k8s]# cd /opt/k8s/ [[email protected]-node1 k8s]# ls admin.csr ca-bundle.crt cert etcd

k8s实践6:从解决报错开始入门RBAC

1.在k8s集群使用过程中,总是遇到各种rbac的权限问题.记录了几个报错,见下: 报错1: "message": "pods is forbidden: User \"kubernetes\" cannot list resource \"pods\" in API group \"\" at the cluster scope" "message": "pservices

013.Kubernetes认证授权

一 Kubernetes认证系统介绍 1.1 访问控制 Kubernetes API的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证.授权以及准入控制(Admission Control)等 1.2 认证 在集群开启TLS后,客户端发往Kubernetes的所有API请求都需要进行认证,以验证用户的合法性. Kubernetes支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可).如果认证成功,则用户的username会被传入授权模块做进一步授权验证:而对于认证失败

用Flask 搭建RESTful APIs 服务器端

此文摘录自: http://www.cnblogs.com/vovlie/p/4178077.html 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务. REST的六个特性: Client-Server:服务器端与客户端分离. Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的. Cacheable(

POSTMAN and HTTPie to test APIs

http://blog.mashape.com/postman-httpie-test-apis/ We love working with APIs at Mashape, and we love sharing with our community new tools that make your life easier when consuming APIs. Today, we’re taking a look at POSTMAN (Free edition), a GUI power