在 ASP.NET 中的类中进行响应的不良做法.重定向

本文关键字:不良 重定向 响应 ASP NET | 更新日期: 2023-09-27 18:34:26

在我的 ASP.NET 应用程序中,我正在使用一种方法来检查用户权限,以确定用户是否可以查看页面,或被重定向到"无效权限"页面。

由于在母版页上添加此权限重定向会导致无限循环,因此我被迫将其应用于所有页面。我不想将此方法复制到每个页面上,因此我想在我的 Web 应用程序中创建一个包含此方法的类,以便我可以在我的应用程序中全局使用它。

我没有接受过正式的培训,但我的直觉告诉我,在类中放置 Response.Redirect 或任何"Web"函数是一种不好的做法?我说的对吗?如果是这样,有没有更好的方法呢?

在 ASP.NET 中的类中进行响应的不良做法.重定向

在重定向之前,您可以检查当前 url 以确保它不是无效权限页面;因此,只有在您尚未重定向时才会重定向。

if(!Request.RawUrl.Contains("Invalid Permissions Page"))
    Response.Redirect("Invalid Permissions Page");
<</div> div class="answers">

你可以创建一个新类,我们称之为myPageClass,来自System.Web.UI.Page的遗产,然后,包括你需要的所有代码在此类中,使你背后的所有代码都可以从myPageClass继承。

public class myPageClass : System.Web.UI.Page
    {
        public void authorize()
        { 
            // your auth code here
            Response.Redirect("Invalid_Permissions_Page.aspx", false);
        }
    }

public partial class _Default : myPageClass
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Your code here
    }
}

在我看来,在按钮操作的情况下,您不应该使用Response.Redirect,例如,如果它将带您到另一个页面,则无需转到服务器即可执行此操作,这只能在客户端中进行。

首先,您的原始问题:

ASP.NET 的类中进行响应的不良做法?

是的,我认为这是一种不好的做法。 传递委托更安全,然后您的"授权请求"方法可以调用委托。 下面是一个示例:

public static void AuthorizeRequest(Action<string> redirect)
{
    if( /*whatever*/ )
        redirect("/InvalidPermissions.htm");
}
protected void Page_Load(object sender, EventArgs e)
{
    AuthorizeRequest(Response.Redirect);
}

现在更大的问题...你不想这样做!

让每个页面断言授权是编写安全问题的快速方法。 有人会忘记或意外删除断言。 ASP.NET 有多种方法来拦截和过滤为此目的的请求。

最简单的方法是将其放在 Global.asax 文件的事件钩子中。 HttpApplication 对象具有多个可用于此目的的事件。 另一种选择是实现 IHttpModule 接口。 无论哪种方式,我都不会在每个页面中编写代码。