Asp.net core ASP.NET Core如何根据布尔值将用户重定向到页面
简而言之,我有一个razor pages/mvc项目,其中用户必须根据数据库中的布尔值锁定到特定页面 如果此值为true,则用户无法访问任何其他页面,如果试图访问这些页面,则会重定向到锁定页面,只有在表单上输入一些凭据后才能解锁该页面。它不是登录页面,因为用户必须经过身份验证才能访问它Asp.net core ASP.NET Core如何根据布尔值将用户重定向到页面,asp.net-core,Asp.net Core,简而言之,我有一个razor pages/mvc项目,其中用户必须根据数据库中的布尔值锁定到特定页面 如果此值为true,则用户无法访问任何其他页面,如果试图访问这些页面,则会重定向到锁定页面,只有在表单上输入一些凭据后才能解锁该页面。它不是登录页面,因为用户必须经过身份验证才能访问它 我想知道在整个应用程序中实现这一点的最佳方法是什么,这样我就不需要在每个页面上都进行检查了。资源过滤器听起来很合适。大致如下: public class BoolResourceFilter : IAsyncRe
我想知道在整个应用程序中实现这一点的最佳方法是什么,这样我就不需要在每个页面上都进行检查了。资源过滤器听起来很合适。大致如下:
public class BoolResourceFilter : IAsyncResourceFilter
{
private readonly MyContext _db;
private readonly IUrlHelperFactory _urlHelperFactory;
public BoolResourceFilter(MyContext db, IUrlHelperFactory urlHelperFactory)
{
_db = db;
_urlHelperFactory = urlHelperFactory;
}
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
var boolValue = await _db...; // get your bool value;
var urlHelper = _urlHelperFactory.GetUrlHelper(context);
var redirectUrl = urlHelper.Page("~/TruePage");
var currentUrl = context.HttpContext.Request.Path;
// In addition to checking the boolValue, you need to check that
// the URL of the request is not to the redirect page already
// to prevent infinite redirect loop
if (boolValue && currentUrl != redirectUrl)
{
context.Result = new RedirectResult(redirectUrl);
}
await next();
}
}
然后,在Startup.ConfigureServices
中:
services.AddScoped<BoolResourceFilter>();
...
services.AddMvc(o =>
{
o.Filters.Add(typeof(BoolResourceFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);;
services.addScope();
...
services.AddMvc(o=>
{
o、 添加(typeof(BoolResourceFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);;
资源过滤器听起来很合适。大致如下:
public class BoolResourceFilter : IAsyncResourceFilter
{
private readonly MyContext _db;
private readonly IUrlHelperFactory _urlHelperFactory;
public BoolResourceFilter(MyContext db, IUrlHelperFactory urlHelperFactory)
{
_db = db;
_urlHelperFactory = urlHelperFactory;
}
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
var boolValue = await _db...; // get your bool value;
var urlHelper = _urlHelperFactory.GetUrlHelper(context);
var redirectUrl = urlHelper.Page("~/TruePage");
var currentUrl = context.HttpContext.Request.Path;
// In addition to checking the boolValue, you need to check that
// the URL of the request is not to the redirect page already
// to prevent infinite redirect loop
if (boolValue && currentUrl != redirectUrl)
{
context.Result = new RedirectResult(redirectUrl);
}
await next();
}
}
然后,在Startup.ConfigureServices
中:
services.AddScoped<BoolResourceFilter>();
...
services.AddMvc(o =>
{
o.Filters.Add(typeof(BoolResourceFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);;
services.addScope();
...
services.AddMvc(o=>
{
o、 添加(typeof(BoolResourceFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);;
我以前没有使用过过滤器,特别是资源过滤器,如何使用?我必须在页面上使用它作为属性还是什么?我想你的评论来自我更新答案之前。如果这不是您想要的,请展开。根据文档:“资源过滤器有助于缩短大部分管道。例如,缓存过滤器可以避免缓存命中时管道的其余部分。”本质上,它为您提供了一个到请求管道的挂钩,特别是对于资源过滤器,在很多事情发生之前就有一个钩子,它提供了一个短路管道的机会,例如通过返回重定向。在ConfigureServices
中,我将它添加为全局筛选器,这意味着它将在实际调用任何操作/页面之前在每个请求上运行(因为它是一个资源筛选器)。然后它将从数据库中获取值,如果它是真的,那么它将把用户重定向到重定向页面。它还检查请求的URL实际上不是重定向页面,或者它还将捕获客户端在重定向后对该页面的请求并再次尝试重定向(无止境循环)。还有其他类型的筛选器,如果您正在执行基于策略的操作,则授权筛选器可能更适合。基本上,每种过滤器类型都适合于请求管道中的不同位置,并且您希望使用最接近您试图增强的功能的过滤器。请参阅:。我以前没有使用过筛选器,特别是资源筛选器,如何使用它?我必须在页面上使用它作为属性还是什么?我想你的评论来自我更新答案之前。如果这不是您想要的,请展开。根据文档:“资源过滤器有助于缩短大部分管道。例如,缓存过滤器可以避免缓存命中时管道的其余部分。”本质上,它为您提供了一个到请求管道的挂钩,特别是对于资源过滤器,在很多事情发生之前就有一个钩子,它提供了一个短路管道的机会,例如通过返回重定向。在ConfigureServices
中,我将它添加为全局筛选器,这意味着它将在实际调用任何操作/页面之前在每个请求上运行(因为它是一个资源筛选器)。然后它将从数据库中获取值,如果它是真的,那么它将把用户重定向到重定向页面。它还检查请求的URL实际上不是重定向页面,或者它还将捕获客户端在重定向后对该页面的请求并再次尝试重定向(无止境循环)。还有其他类型的筛选器,如果您正在执行基于策略的操作,则授权筛选器可能更适合。基本上,每种过滤器类型都适合于请求管道中的不同位置,并且您希望使用最接近您试图增强的功能的过滤器。请参阅:。