2011-11-26 168 views
1

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

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

感谢

UPDATE: 我发现HttpContext.Application状态作品保存数据,还是我不知道,如果是使用它的控制器考虑到它在Azure中的好主意,将它适合生产?

+0

您不应**使用应用程序状态来存储以用户为中心的数据。特别是在Azure中(但不仅在Azure中)。引用来自:http://msdn.microsoft.com/en-us/library/ms178594.aspx: *“应用程序状态是一个有用的地方,可以存储**不会从一个用户更改的少量常用数据到另一个**。“* – astaykov

+0

是的,我真的不想使用状态,谢谢:)虽然它不是用户数据只是将公开的数据 – Keoz

回答

0

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

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

3

您可以使用wctx URL参数在WS联合重定向序列中传递状态。在处理初始POST请求的动作中,应该保留要保留的表单参数,然后将URL重定向到身份提供者选择页面(这将必须是一个自定义页面),同时将表单参数附加到该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价值,做一个重定向到它没有任何更多的处理动作。这使事情变得简单。

+0

哦,我明白了,所以这个参数将永远返回后登录,我可以将它附加到IP网址 – Keoz

+0

好的,我想这是一个不错的起点我得到它,wctx参数里面有参数,所以我认为我必须修改这个字符串并让我的参数在那里,现在另一个新手问题是当用户回来时如何从控制器返回代码:? – Keoz

+0

我发现这篇文章有帮助http://stackoverflow.com/questions/8240124/a-custom-login-page-for-azure-acs-not-working我想我很近我会深入这东西:)谢谢 – Keoz