亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

防止直接 url 訪問剃刀頁面處理程序

防止直接 url 訪問剃刀頁面處理程序

C#
胡子哥哥 2022-12-31 11:09:10
我制作了剃刀頁面來注銷用戶。當經過身份驗證的用戶訪問路由時/account/logout,我想向他顯示帶有成功消息的頁面,如果用戶是匿名的,則頁面未授權。但是,不能通過直接 url 輸入訪問此成功頁面。以下代碼運行良好,除了任何人都可以導航到/account/logout/success正常頁面(并且由于它不負責注銷,因此可能會造成混淆)。public class LogoutModel : CustomPageModel{    private readonly SignInManager _signInManager;    public LogoutModel(SignInManager signInManager) => _signInManager = signInManager;    public async Task<IActionResult> OnGetAsync()    {        if (_signInManager.IsSignedIn(User))        {            await _signInManager.SignOutAsync();            return RedirectToPage("Logout", "Success");        }        return Unauthorized();    }    public void OnGetSuccess()    {    }}如何防止直接訪問處理程序 OnGetSuccess?
查看完整描述

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>();

});


查看完整回答
反對 回復 2022-12-31
?
慕少森

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


查看完整回答
反對 回復 2022-12-31
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

在您的場景中,用戶退出并重定向為匿名用戶。所以不能說這里只有某些用戶可以訪問此操作。

你應該用其他方式解決這個問題。比如你可以在Action中設置cookie中的值,LogOut然后在SuccessAction中簽入。為了獲得更多安全性,請應用 MVC 用于CSRF的模式。


查看完整回答
反對 回復 2022-12-31
  • 3 回答
  • 0 關注
  • 101 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號