如何解决使用 .NET Core 3.1 和 HttpContext 的客户端 IP 地址错误
我想获取客户端的 IP 地址(例如 Chrome 浏览器),然后使用它为我的 blob 存储资源生成 SAS 令牌。
为此我使用这行代码:
// In Startup.cs class:
services.AddHttpContextAccessor();
// In controller method:
// _httpContextAccessor is IHttpContextAccessor interface
var clientIpAddress = _httpContextAccessor.HttpContext.Request.HttpContext.Connection.RemoteIpAddress;
var blobClient = blobContainerClient.GetBlobClient();
var blobSasBuilder = new BlobSasBuilder
{
StartsOn = now,ExpiresOn = now.AddMinutes(10),BlobContainerName = blobClient.BlobContainerName,IPRange = new SasIPRange(clientIpAddress) // im using clientIpAddress here
};
当我在 https://www.myip.com/
站点中检查我的 ip 时,我得到了与 Azure 门户 gui 一起使用以生成 sas 令牌的 ip(生成它后我可以访问 blob 上的资源)
当我将我的应用程序部署到 Azure 时,IP 与来自 https://www.myip.com/
站点的 IP 完全不同,我不允许为我的 chrome 浏览器生成 sas 令牌。
我的问题是,为什么当我将应用部署到 Azure HttpContext
时返回错误的客户端 Ip 地址?
解决方法
根据我的理解,您希望生成一个 SAS 令牌,用于请求具有客户端公共 IP 地址限制的客户端。我编写了一个可以满足您要求的简单控制器:
using System;
using Azure.Storage.Blobs;
using Azure.Storage.Sas;
using Microsoft.AspNetCore.Mvc;
namespace getSasTest.Controllers
{
[ApiController]
[Route("[controller]")]
public class SasTokenController : ControllerBase
{
[HttpGet]
public string get()
{
var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;
var connstr = "<your connection string here>";
var container = "files";
var blob = "test.txt";
var blobClient = new BlobContainerClient(connstr,container).GetBlobClient(blob);
var blobSasBuilder = new BlobSasBuilder
{
BlobContainerName = blobClient.BlobContainerName,BlobName = blobClient.Name,IPRange = new SasIPRange(remoteIpAddress),};
blobSasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(10);
blobSasBuilder.SetPermissions(BlobSasPermissions.Read);
var sas = blobClient.GenerateSasUri(blobSasBuilder);
return sas.ToString();
}
}
}
您可以尝试在此处获取用于测试的 SAS 令牌: https://stanwinapp.azurewebsites.net/sastoken
使用此令牌访问 blob:
它在本地不起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。