我在我的ASP.net MVC 3网站(也在Azure中托管)中使用Azure ACS,方案如下: 用户首先进入我的网站并填写一个字段表单,然后他们需要选择提供商并登录,但首先我想存储字段值,以便当他们从登录返回时我能够创建具有此值的配置文件对于用户来说。
所以我相信当他们第一次进入网站,然后离开登录并再次进入网站时,这是两个不同的会议,我是对的吗?这就是使用会话状态(通过SQL Server)存储的数据在登录后返回时不存在的原因我是对的吗?如果这是真的那么什么是最好的方法呢?如果没有那么我做错了存储临时数据的错误吗?
由于
更新 我发现HttpContext.Application状态可以保存数据,但是我不确定在控制器中使用它是否是一个好主意,考虑到它在Azure中,它是否可以正常生产?
答案 0 :(得分: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编码版本:
wctx=https://yourserver/yourapp/yourpage?yourparameter=foo
然后,从ACS接收重定向的操作将简单地提取wctx的值并重新定向到它而不再进行任何处理。这使事情变得简单。
答案 1 :(得分:0)
另一种方法是保存您需要在数据库中传递的任何数据,并传递一些引用回数据库记录的ID。您将此ID传递给IP并通过wctx传回(如上面提到的Mike)。
这将解决URL数量有限的问题(如果您的数据非常大)。当然,你需要管理这些数据的删除,但这应该不难。