- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
dotnet最小webApi开发实践 。
软件开发过程中,经常需要写一些功能验证代码。通常是创建一个console程序来验证测试,但黑呼呼的方脑袋界面,实在是不讨人喜欢.
Web开发目前已是网络世界中的主流,微软在asp.net框架大行其道之下,也整了个最小webapi项目开发向导.
今天,我也拥抱一下新的开发模式,来使用webapi方式来做一个小的应用实践.
打开宇宙最强编辑器VS2022,根据向导进行创建新项目,我们选择ASP.NET Core Web API项目.
。
。
填写项目配置信息,我们今天来创建一个访客IP白名单授权的功能。功能就是当访客访问web页面时,页面请求api授权,api对网络授权请求来源进行判断,当访客来源地址为白名单中的地址时,返回一个http 200的响应,当访客来源IP不在白名单时,返回一个 http 401未证的响应.
。
。
.net框架选项中,最低只有.net8.0可选 。
。
。
点击创建,vs自动为我们生成了项目和代码 。
。
namespace flyfire.whitelistAuthorization { public class Program { public static void Main( string [] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseAuthorization(); app.MapControllers(); app.Run(); } } }
。
框架不仅生成了代码,还默认增加了调试模式下使用丝袜哥(swagger)作为web测试的界面,真是贴心啊.
。
。
向导生成了一个天气预报的类和一个web控制器 。
天气预报的类 。
namespace flyfire.whitelistAuthorization { public class WeatherForecast { public DateOnly Date { get ; set ; } public int TemperatureC { get ; set ; } public int TemperatureF => 32 + ( int )(TemperatureC / 0.5556); public string ? Summary { get ; set ; } } }
天气预报web控制器 。
using Microsoft.AspNetCore.Mvc; namespace flyfire.whitelistAuthorization.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet(Name = "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); } } }
。
什么代码都不用写,一个最小示例webApi接口方法就OK了.
。
下面我们来编写一个自己的功能.
在解决方案管理器控制目录上,右键菜单,新建一个API控制器.
。
选择API分类 。
。
。
。
我们创建一个名为 “WhitelistAuthorization”的空的API控制器. 。
我们将在WhitelistAuthorization控制器中,实现一个Authorization接口方法,当请求来源的IP地址为白名单地址时,返回StatusCode 200,并返回一些信息,否则返回StatusCode 401和未授权信息.
我们在appsetting.json中使用的个section存放白名单IP信息.
"WhiteIpList": { "IpList": [ "127.0.0.1" ] }
我们创建一个类WhiteIpList用于映射配置数据.
public class WhiteIpList { public List< string > IpList { get ; set ; } }
。
在Main函数中,增加如下代码,将配置段实例化绑定并注入到依赖注入(DI)容器 。
builder.Services.Configure<WhiteIpList>(builder.Configuration.GetSection("WhiteIpList")),
。
然后,我们在WhitelistAuthorization控制器的构造函数中,注入配置参数.
。
private readonly WhiteIpList _whiteIpList,
。
public WhitelistAuthorizationController(IOptions<WhiteIpList> whiteIpList) 。
{ 。
_whiteIpList = whiteIpList.Value,
} 。
。
接着,我们增加一个认证授权方法,用于认证授权,返回状态码200或401.
。
[HttpGet("[action]")] [HttpPost("[action]")] public IActionResult Authorization() { var remote_ip = GetClientIpAddress(HttpContext.Request); if (Untility.IsIpExist(_whiteIpList.IpList, remote_ip)) { return Ok(new { body = new { code = 200 } }); } else { return StatusCode(401, "Unauthorized: IP address not in whitelist."); } }
。
。
HttpRequest的HttpContext.Connection.RemoteIpAddress中可获得浏览端的IP地址.
。
不过,如果认证服务接口需经过Nginx转发时,则需要对Nginx进行一些配置以及相应的代码处理方可有效获取到浏览端的IP.
当网络HTTP请求经过Nginx服务器转发时,Web API仍然有可能获取到请求方的IP地址,但这取决于Nginx的配置以及Web API如何解析这些信息。 。
。
Nginx配置 。
Nginx可以通过proxy_set_header指令来添加或修改转发给后端服务器的请求头。为了获取请求方的IP地址,你需要在Nginx配置文件中设置X-Forwarded-For请求头,该请求头会包含客户端的原始IP地址.
。
例如,你可以在Nginx的配置文件(通常是nginx.conf或某个站点的配置文件)中添加以下行:
。
proxy_set_header X-Forwarded-For $remote_addr,
。
这行代码会将客户端的IP地址添加到X-Forwarded-For请求头中,并将其转发给后端服务器。如果客户端和Nginx之间有多层代理,X-Forwarded-For请求头可能会包含多个IP地址,第一个地址通常是客户端的原始IP.
。
Web API解析 。
在Web API中,你需要检查X-Forwarded-For请求头来获取客户端的IP地址。这通常涉及到从HTTP请求中提取请求头信息.
。
以下是一个在ASP.NET Core Web API中获取客户端IP地址的示例代码:
。
csharp public string GetClientIpAddress(HttpRequest request) { // 首先尝试从X-Forwarded-For请求头中获取IP地址 var xForwardedFor = request.Headers["X-Forwarded-For"].ToString(); if (!string.IsNullOrEmpty(xForwardedFor)) { // 如果X-Forwarded-For包含多个IP地址,取第一个地址作为客户端IP var ipAddresses = xForwardedFor.Split(','); return ipAddresses.FirstOrDefault()?.Trim(); } // 如果X-Forwarded-For不存在,则尝试从RemoteAddress属性中获取IP地址 return request.HttpContext.Connection.RemoteIpAddress?.ToString(); }
。
在这段代码中,我们首先尝试从X-Forwarded-For请求头中获取IP地址。如果请求头不存在或为空,我们则回退到从RemoteAddress属性中获取IP地址。但请注意,当请求经过Nginx转发时,RemoteAddress属性可能会包含Nginx服务器的IP地址,而不是客户端的IP地址.
。
注意事项 。
安全性:X-Forwarded-For请求头可以被客户端伪造,因此它不应该被视为绝对可靠的客户端IP地址来源。在需要高安全性的场景中,你可能需要采取额外的措施来验证客户端的IP地址.
配置一致性:确保你的Nginx服务器和后端Web API都正确配置了相关的请求头处理和解析逻辑.
多层代理:如果请求经过了多层代理服务器,X-Forwarded-For请求头可能会包含多个IP地址。你需要确定如何解析和使用这些地址。如果X-Forwarded-For包含多个IP地址,取第一个地址作为客户端IP 。
。
。
运行项目,在swaggerUI界面框架中进行测试验证 。
。
。
使用localhost地址测试,无法得到有效的IP址,白名单验证失败.
。
使用127.0.0.1的回环地址测试,可通过白名单验证.
。
以上,我们使用少量代码,就简单实现了一个支持Get和Post方法的并且可使用配置文件的Authorization授权接口.
。
。
最后此篇关于dotnet最小webApi开发实践的文章就讲到这里了,如果你想了解更多关于dotnet最小webApi开发实践的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 Ubuntu v16.04 上安装了 dotent core。问题是当我尝试使用 dotnet user-secrets 时它说:未找到匹配命令“dotnet-user-secrets”的可执行
好。这似乎是我看到答案时会面对的问题类型。 所以... 为什么要打扰 dotnet build做之前dotnet publish ? build自动执行 restore .凉爽的。 好像publish
我正在尝试创建一个 dotnet 新模板的 NuGet 包。我创建了一个 nuspec 文件来设置包的详细信息,它位于我的内容文件夹旁边,其中包含我想要打包的所有内容: My.
我正在尝试使用'dotnet dev-certs'工具导出https证书以包含在Docker镜像中。现在我正在使用: dotnet dev-certs https -v -ep $(HOME)\.as
我昨天从 .Net 5 更新到 .Net 6,现在我的项目无法从 dotnet run 开始。然后我得到错误: Building... warn: Microsoft.AspNetCore.Serve
我使用 dockerfile 成功构建,但是当我尝试从构建镜像运行新容器时,出现以下错误: 我必须为解决方案做什么? Error : /bin/sh: 1: [dotnet,: not found d
我有一个引用其他几个项目的 .NET Core 3 项目。我的主根项目有一个 Release-X构建配置,但其他项目只有 Release配置,无匹配 Release-X配置。 当我尝试使用这个发布我的
我的 dotnet new 列表中有许多“孤立的”dotnet 模板。 它们不再存在于我的驱动器上,因为我删除了文件夹,所以我不能 dotnet new --uninstall。 有没有办法从列表中删
编辑: 以下是最初与标题一起发布的前一个问题 xunit show ITestOutputHelper output when run in the console 经过调查(见评论),这个问题仍然非
来自 docs.microsoft.com: dotnet build - Builds a project and all of its dependencies. dotnet run - Run
我有一个 Dotnet 核心项目,我试图在其中安装 Microsoft.EntityFrameworkCore.Tools.Dotnet 以使用迁移。我在 Mac 上,所以我使用 MySql.Data
我已经在这个问题上徘徊了很长一段时间,但仍然没有找到答案,也没有其他帖子处理同样的问题。 我已经发布了一个 .net 5.0 网站,如果我在同一个发布的文件夹中运行 dotnet,一切都会正常运行。在
我正在尝试使用 CLI dotnet 命令复制以下 Azure 管道: - task: DotNetCoreCLI@2 inputs: command: publish publi
假设这个文件夹结构 SampleApp global.json Src Web pro
我正在使用dotnet watch命令来运行asp.net core项目。但是,默认情况下,它选择 Production 作为环境。 我已经尝试了这两个选项: 1) > dotnet watch AS
我正在尝试在 Linux 主机上的官方 Microsoft/dotnet 镜像之外的容器中构建一个 dotnet 项目,因为该镜像与 Windows 和 Linux 都兼容。我只有 linux 主机,
我不是 Linux 用户,所以这可能是一个简单的修复,但我已经尝试了以下方法: 首先我使用命令 curl -sSL https://dot.net/v1/dotnet-install.sh | bas
我在发布配置文件中遇到了 Visual Studio 和 EF 迁移的奇怪情况。鉴于: Visual Studio 2019 v16.4 .NET 核心项目。目标 .NET Core 3.1 EF 3
我已经安装了 .NET Core 1.0.1 以与 VS 2015 Update 3 一起使用,并且以管理员身份运行(在 Windows 8.1 x64 上)。 如果我创建任何 .NET Core 项
我正在尝试为dotnet core 2创建开发Dockerfile。到目前为止,我的工作是: FROM microsoft/aspnetcore-build:2.0 VOLUME /app WORKD
我是一名优秀的程序员,十分优秀!