如何在使用SimpleWorkerRequest加载页面时访问会话变量?

3
我正在将一个ASPX文件作为字符串读取,并将返回的HTML作为电子邮件消息的源。以下是代码:

public string GetEmailHTML(int itemId)
{
    string pageUrl = "HTMLEmail.aspx";

    StringWriter stringWriter = new StringWriter();
    HttpRuntime.ProcessRequest(new SimpleWorkerRequest(pageUrl, "ItemId=" + itemId.ToString(), stringWriter));
    stringWriter.Flush();
    stringWriter.Close();

    return stringWriter.ToString();
}

HTMLEmail.aspx使用ItemId查询字符串变量从数据库加载数据并填充页面结果。我需要保护HTMLEmail.aspx页面,以便操纵的查询字符串不会让任何人查看结果。

我这样存储当前用户:

public User AuthenticatedUser
{
    get { return Session["User"] as User; }
    set { Session["User"] = value; }
}

由于页面请求不是直接由浏览器发起的,而是由SimpleWorkerRequest发起的,因此没有发布的SessionId,因此HTMLEmail.aspx无法访问任何会话变量。至少我认为这是问题所在。
我已经阅读了关于会话变量的概述:http://msdn.microsoft.com/en-us/library/ms178581.aspx 我想知道是否需要实现自定义会话标识符。我可以在GetEmailHTML方法中获取当前SessionId,并将其作为查询字符串参数传递到HTMLEmail.aspx。如果我在HTMLEmail.aspx中有SessionId,我可以使用自定义会话标识符来访问会话变量。
这个修复听起来很混乱。它还删除了ASP自动应用于SessionId的加密层。
有更好的想法吗?
1个回答

1
据我所见,你最好的选择是通过查询参数将你需要的所有值传递到HTMLEmail.aspx中,就像你使用ItemId一样。
除此之外,你可能只需向该页面发送用户的UserId,并使其访问数据库(或存储用户的任何其他地方)以获取User对象,而不是尝试从Session变量中读取它。

编辑:

为什么不使用:

public string GetEmailHTML(int itemId)
{
    string pageUrl = "HTMLEmail.aspx";

    StringWriter stringWriter = new StringWriter();
    Server.Execute(pageUrl, stringWriter);
    stringWriter.Flush();
    stringWriter.Close();

    return stringWriter.ToString();
}

那么,我所知道的是Server.Execute继承了相同的HTTP请求。


已经考虑过以那种方式实现,但安全性不够。获取会话变量的目的是验证经过身份验证的用户是否有权访问数据库中的数据。我们知道查询字符串(URL)可以被操纵。如果UserID和ItemId一样容易被操纵,那么对授权访问的检查就毫无用处。 - mbursill
我曾经认为HTMLEmail.aspx受到了外部世界的保护。就我所知,它本来就没有公开访问的理由。因此,如果在GetEmailHTML中执行必要的安全检查,则无需进一步确保安全性。 - paracycle
Server.Execute正是我所需要的!谢谢! - mbursill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接