首页 > 编程语言 >Basic Authentication in ASP.NET Web API

Basic Authentication in ASP.NET Web API

时间:2023-08-24 15:59:16浏览次数:56  
标签:Web ASP string void Authentication API credentials password

Basic Authentication in ASP.NET Web API

原始资料:Basic Authentication in ASP.NET Web API | Microsoft Learn

演示了如何实现basic 身份验证。

 

注意:

在 Web API 2 中,您应该考虑编写身份验证过滤器或 OWIN 中间件,而不是 HTTP 模块。

In Web API 2, you should consider writing an authentication filter or OWIN middleware, instead of an HTTP module.

微软的这篇文档,还是很有学习价值的,毕竟思路都是相似的。

 

自定义了一个HttpModule:

namespace WebHostBasicAuth.Modules
{
    public class BasicAuthHttpModule : IHttpModule
    {
        private const string Realm = "My Realm";

        public void Init(HttpApplication context)
        {
            // Register event handlers
            context.AuthenticateRequest += OnApplicationAuthenticateRequest;
            context.EndRequest += OnApplicationEndRequest;
        }

        private static void SetPrincipal(IPrincipal principal)
        {
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }

        // TODO: Here is where you would validate the username and password.
        private static bool CheckPassword(string username, string password)
        {
            return username == "user" && password == "password";
        }

        private static void AuthenticateUser(string credentials)
        {
            try
            {
                var encoding = Encoding.GetEncoding("iso-8859-1");
                credentials = encoding.GetString(Convert.FromBase64String(credentials));

                int separator = credentials.IndexOf(':');
                string name = credentials.Substring(0, separator);
                string password = credentials.Substring(separator + 1);

                if (CheckPassword(name, password))
                {
                    var identity = new GenericIdentity(name);
                    SetPrincipal(new GenericPrincipal(identity, null));
                }
                else
                {
                    // Invalid username or password.
                    HttpContext.Current.Response.StatusCode = 401;
                }
            }
            catch (FormatException)
            {
                // Credentials were not formatted correctly.
                HttpContext.Current.Response.StatusCode = 401;
            }
        }

        private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var request = HttpContext.Current.Request;
            var authHeader = request.Headers["Authorization"];
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                        StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                {
                    AuthenticateUser(authHeaderVal.Parameter);
                }
            }
        }

        // If the request was unauthorized, add the WWW-Authenticate header 
        // to the response.
        private static void OnApplicationEndRequest(object sender, EventArgs e)
        {
            var response = HttpContext.Current.Response;
            if (response.StatusCode == 401)
            {
                response.Headers.Add("WWW-Authenticate",
                    string.Format("Basic realm=\"{0}\"", Realm));
            }
        }

        public void Dispose() 
        {
        }
    }
}

 

要启用 HTTP 模块,请将以下内容添加到 web.config 文件的 system.webServer 部分:

<system.webServer>
    <modules>
      <add name="BasicAuthHttpModule" 
        type="WebHostBasicAuth.Modules.BasicAuthHttpModule, YourAssemblyName"/>
    </modules>

 

标签:Web,ASP,string,void,Authentication,API,credentials,password
From: https://www.cnblogs.com/Tpf386/p/17654304.html

相关文章

  • 通用Web后台魔方NewLife.Cube
    转自:大石头老师的魔方  链接:https://www.cnblogs.com/nnhy/p/cube.html通用Web后台魔方NewLife.Cube 魔方是一个基于ASP.NETMVC的用户权限管理平台,可作为各种信息管理系统的基础框架。演示:http://cube.newlifex.com 源码源码: http://git.newlifex.com/NewLife/N......
  • app和web测试的区分
    web测试和app的测试区别有哪些????一、系统架构不同web项目主要是基于浏览器的bs架构,而app项目主要是基于手机端的cs架构二、测试方法不同功能测试:web不支持离线浏览,但是有的app支持;性能测试:web主要关注服务器性能,app除了服务器还有考虑手机端的性能;兼容测试:web主要考虑浏览器的兼容性......
  • Nginx-配置WebSocket反向代理
    客户环境因开放端口有限,部署Portainer后默认端口无法访问,故使用nginx做转发,按照正常http协议配置nginx,启动后发现portainer默认的进入容器的功能无法使用,排查后发现报错如下。错误信息为websocket连接问题,需要更改nginx配置为websocket。仅修改http块中的内容即可。map$http_......
  • Python Web:Django、Flask和FastAPI框架对比
    Django、Flask和FastAPI是PythonWeb框架中的三个主要代表。这些框架都有着各自的优点和缺点,适合不同类型和规模的应用程序。Django:Django是一个全功能的Web框架,它提供了很多内置的应用程序和工具,使得开发Web应用程序更加容易。Django采用了MTV(模型-模板-视图)设计模式,提供ORM......
  • 创建web应用程序,React和Vue怎么选?
    React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持,代码库可以很大程度地扩展,允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝,可以解决你在开发阶段可能遇到的任何问题。毫无疑问,React是创建跨平台解决方案的最佳框架......
  • 静态Web服务器-以⾯向对象的模式开发
    步骤1.把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)2.提供Web服务器的初始化⽅法,在初始化⽅法⾥⾯创建socket对象3.提供⼀个启动Web服务器的⽅法,让Web服务器处理客户端请求操作。 示例1importsocket2importthreading34#获取用户请求资源的路径5......
  • spring web mvc 集成 fastjson2
    maven依赖参考文档https://github.com/alibaba/fastjson2/blob/main/docs/spring_support_cn.md<!-spring5使用这个-><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2-extension-spring5</artifactId&......
  • org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan(Lorg/apache/tomcat/
    原因<dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>3.1.3</version></dependency>解决<dependency>......
  • WebRTC入门
    1、概念WebRTC(WebReal-TimeCommunications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。2、通讯流程的建立首先,从概念可以看出,WebRTC通讯过程不需要中间媒介(P......
  • 为什么vite比webpack速度快
    一.webpack为什么慢主要是由于其内部的核心机制——bundle模式引发的webpack通过bundle机制,将项目中各种类型的源文件转化供浏览器识别的js、css、img等文件,建立源文件之间的依赖关系,将数量庞大的源文件合并为少量的几个输出文件。bundle工作机制的核心部分分为两块:构建......