4

我正在尝试找到一种处理以下情况的好方法(我对此还是有点陌生​​):

用户可以使用 RPX/OpenId 提供程序通过我的站点进行注册。

第 1 步:用户通过提供者进行身份验证。提供者将一个临时令牌返回给我的一种操作方法。

第 2 步:我使用令牌获取用户的个人资料信息并加载允许他们输入任何缺少的必填字段和可选字段的视图。

我在第 2 步中使用了 2 种操作方法:一种使用令牌来处理信息的获取。获取授权信息并加载缺失/可选字段视图的第二个操作。

我通过 TempData 将授权信息传递给第二个操作。第二个操作可以处理验证,因此我有可能需要保留授权对象来处理超过 1 个请求。我不能使用令牌来重新生成授权信息,因为它在技术上是一次性令牌,并且重新生成请求会很愚蠢,因为它正在使用网络资源。

对于同一操作的任何后续请求,我如何将对象保留在我的 TempData 中,但删除任何重定向的对象?由于这在我的应用程序中可能是可重复的模式,我应该创建一个过滤器来自动处理这种情况吗?

例如,我想象一个过滤器属性,它将 TempData(如果有的话)合并到 ViewData - 但是我如何将我的数据保存到未来对同一操作的调用中?再次将其放入 TempData 中?如果我检测到重定向清空 TempData?

谢谢

4

2 回答 2

3

如有必要,我最终将数据重新添加到 TempData。由于 TempData 不允许您添加重复的密钥,因此我创建了自己的辅助方法来删除然后重新添加密钥:

public static void AddNew(this TempDataDictionary tempData, string key, object obj)
{
    if ( tempData.ContainsKey( key ) ) tempData.Remove( key );

    tempData.Add( key, obj );
}
于 2009-06-29T18:50:09.027 回答
1

我遇到了同样的问题,但处理方式略有不同 - 我使用了仅适用于 OpenID 的表单身份验证方法......如果我的提供者返回 Authenticated,我将执行以下操作

                var fields = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse;

                if (fields != null)
                {
                    TempData["Email"] = fields.Email;
                    TempData["Nickname"] = fields.Nickname;
                }

                FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, false);

                break;

这意味着我不需要传递任何类型的身份验证令牌 - 执行此代码后,我知道我的用户已通过身份验证。

因此,将控制权传递给的操作将简单地将 TempData 字段(如果已填充)复制到 ViewData 中并将它们传递到视图中。

验证在此之后处理 - 我不在乎 OpenID 返回什么(即它是否有效),我让用户编辑它然后保存,然后执行我的验证。

于 2009-06-25T13:32:10.517 回答