3 回答
TA贡献1998条经验 获得超6个赞
我已经通过使用检查 Referer 标头的 Attribute 和 IPageFilter 解决了这个问题。
首先我创建了属性
[AttributeUsage(AttributeTargets.Method)]
public class ChildHandlerAttribute : Attribute
{
}
然后我GetOnSuccess()用它装饰了处理程序
[ChildHandler]
public void OnGetSuccess()
{
}
然后我实现了检查子处理程序的 Referer 标头的过滤器。
public class ChildHandlerAsyncPageFilter : IAsyncPageFilter
{
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
var pageHandlerExecutedContext = await next();
if (pageHandlerExecutedContext.HandlerMethod?.MethodInfo.GetCustomAttribute<ChildHandlerAttribute>() == null)
{
return;
}
var referrer = context.HttpContext.Request.Headers["Referer"].ToString();
var request = pageHandlerExecutedContext.HttpContext.Request;
if (!referrer.StartsWith($"{request.Scheme}://{request.Host}"))
{
pageHandlerExecutedContext.Result = new NotFoundResult();
}
}
public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context) => Task.CompletedTask;
}
最后,我将过滤器添加到Startup.cs中的管道中
services.AddMvc(options =>
{
options.Filters.Add<ChildHandlerAsyncPageFilter>();
});
TA贡献2019条经验 获得超9个赞
请回答这个问题,了解它如何成为可能。
不确定我是否建议走那条路,因为它有点脏而且是一个不必要的复杂解决方案。您可以为登录/注销用户返回不同的状态消息。
注销.cshtml.cs
public class LogoutModel : CustomPageModel
{
private readonly SignInManager _signInManager;
public LogoutModel(SignInManager signInManager) => _signInManager = signInManager;
public string StatusMessage { get; set; }
public async Task<IActionResult> OnGetAsync()
{
if (_signInManager.IsSignedIn(User))
{
await _signInManager.SignOutAsync();
StatusMessage = "Successfully logged out!";
return Page();
}
else {
StatusMessage = "Already logged out!";
return Page();
}
}
}
注销.cshtml
@page
@model X.LogoutModel
@Model.StatusMessage
- 3 回答
- 0 关注
- 73 浏览
添加回答
举报