1

我在我的 ASP.net MVC 3 网站(也托管在 Azure 中)中使用 Azure ACS,场景是这样的:用户首先进入我的网站并填写一个字段表单,然后他们需要选择一个提供商并登录,但是首先,我想存储字段值,以便当他们从登录返回时,我可以为登录用户创建具有此值的配置文件。

所以我相信当他们第一次进入站点然后离开登录并再次进入站点时,这是两个不同的会话,对吗?这就是使用会话状态(通过 SQL Server)存储的数据在登录后返回时不存在的原因,对吗?如果这是真的,那么最好的方法是什么?如果不是,那么我在存储临时数据时做错了什么,对吗?

谢谢

更新: 我发现 HttpContext.Application 状态可以保持数据,但我仍然不确定在控制器中使用它是否是个好主意,考虑到它在 Azure 中,它会在生产中正常工作吗?

4

2 回答 2

3

您可以使用 wctx URL 参数在 WS-Federation 重定向序列中传递状态。在处理初始 POST 请求的操作中,您应该获取要保留的表单参数,然后重定向到您的身份提供者选择页面(这必须是自定义页面),并将表单参数附加到 URL。当用户在您的页面上选择一个 IP 时,您可以使用 wctx 参数再次传递该参数。WS-Federation 被动请求者配置文件表明,当 IP 将用户重定向回您的站点时,这最终应该返回给您。

这有一些细节

http://msdn.microsoft.com/en-us/library/bb608217.aspx

编辑:当用户最终返回您的应用程序时,从请求中获取 wctx 参数。在动作代码中加入如下内容:

var fam = FederatedAuthentication.WSFederationAuthenticationModule;

if (fam.CanReadSignInResponse(System.Web.HttpContext.Current.Request, true))
{
    string wctxValue = this.HttpContext.Request.Form["wctx"];
}

我的偏好是让 wcxt 参数表示一个重定向 URL(URL 编码),并将您的参数作为查询参数,因此它是一个 URL 编码版本:

wctx=https://yourserver/yourapp/yourpage?yourparameter=foo

然后,从 ACS 接收重定向的操作将简单地提取 wctx 的值并对其进行重定向,而无需进行任何处理。这使事情变得简单。

于 2011-11-26T20:29:28.300 回答
0

另一种方法是将需要传递的任何数据保存在数据库中,然后传递一些引用回数据库记录的 ID。您将通过 wctx 将此 ID 传递给 IP 并返回(正如上面提到的 Mike)。

这将解决 URL 长度有限的问题(如果您的数据非常大)。当然,您需要管理删除这些数据,但这应该不难。

于 2012-03-01T21:20:41.727 回答