请参阅此StackOverflow问题。
我正在将一个应用程序从.Net Framework移植到.Net Core 3.1。在.Net Framework解决方案中使用了上述SO问题中的解决方案,以确保控制器只能由同一服务器上的其他应用程序使用。
我找到了一个类似的AuthorizeAttribute,但它没有相同的方法来覆盖。
我还认为我知道如何添加过滤器:
services.AddControllers(options =>
{
options.Filters.Add(*some_filter_here*);
});
但我不知道如何创建过滤器。
如何在.Net Core 3.1中做到这一点?或者有没有一种不同的方式来做我想做的事?
您可以创建一个自定义授权过滤器:
public class LocalAuthorizationFilter : IAuthorizationFilter
{
public LocalAuthorizationFilter()
{
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var isLocal = context.Request.IsLocal();
if (!isLocal)
{
context.Result = new ForbidResult();
}
}
public static bool IsLocal(this HttpRequest req)
{
var connection = req.HttpContext.Connection;
if (connection.RemoteIpAddress != null)
{
if (connection.LocalIpAddress != null)
{
return connection.RemoteIpAddress.Equals(connection.LocalIpAddress);
}
else
{
return IPAddress.IsLoopback(connection.RemoteIpAddress);
}
}
// for in memory TestServer or when dealing with default connection info
if (connection.RemoteIpAddress == null && connection.LocalIpAddress == null)
{
return true;
}
return false;
}
}
不再有IsLocal属性(HttpRequest文档(,所以我在您的类中添加了一个。您可以提取它并将其添加到扩展类中,以便在任何地方使用。为这个家伙喝彩