4

私は次のシナリオを処理するための良い方法を見つけようとしています(私はまだこれに少し慣れていません):

ユーザーは、RPX/OpenIdプロバイダーを使用して私のサイトから登録できます。

ステップ1:ユーザーはプロバイダーを介して認証します。プロバイダーは、アクションメソッドの1つに一時トークンを返します。

ステップ2:トークンを使用してユーザーのプロファイル情報を取得し、不足している必須フィールドとオプションフィールドを入力できるビューをロードします。

ステップ2では2つのアクションメソッドを使用します。1つはトークンを使用した情報の取得を処理するためのものです。許可情報を取得し、欠落/オプションのフィールドビューをロードする2番目のアクション。

TempDataを介して認証情報を2番目のアクションに渡します。2番目のアクションは検証を処理できるため、1つ以上のリクエストに対して承認オブジェクトを保持する必要がある可能性があります。技術的には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 に答える