2009-05-29 38 views
2

コントローラーメソッドで[Authorize]属性を使用した後にポストデータを保存すると、ユーザーはログインページにリダイレクトされ、認証が成功するとそのユーザーは元の場所にリダイレクトされます行くつもりです - これはどうやって行なわれますか?元のフォーム送信は、デフォルトでは中継されません。以前の投稿への返信は次のようになりました:Authorize属性でポストデータが保持されない

フォームの値とRedirectUrlを非表示フィールドにシリアル化する必要があります。 認証後、非表示フィールドのデータをデシリアライズし、RedirectUrlの値に基づいてリダイレクトします。 これを処理するにはカスタムAuthorizeクラスが必要です。

私の質問は正しいですか?はい、コントローラクラスに[Serialize]タグを追加できますが、カスタムAuthorizeクラスの作成がどのように役立つのかわかりません。カスタムのAuthorizeクラスを作成するにあたっては、オンラインの資料がたくさんありますが、デシリアライゼーションはどこで行われますか?あなたが1つまたは2つのレベルを深くすることができれば、大いに役立ちます。私は初心者です。

(私は以前の投稿にコメントしますが、私はこのサイトを初めて知り、十分なポイントを集めていませんでした。

+1

フォーム自体の提出に承認が必要な場合、フォームを表示する理由は何ですか?なぜフォームの表示アクションに[Authorize]属性を入れないのですか? –

+0

私は、彼が許可されたユーザーと権限のないユーザーの両方のフォームを表示する必要がある状況があると思います。たとえば、フォーラムに検索ボックスを表示するには、登録ユーザーのみが検索を行うための承認を受けています。 –

+0

私はJohannes Setiabudiに同意します。私は、認証プロセス全体でPOSTデータを永続化しようとする考えは悪い考えです。 POSTがシンプルで軽いプロセスでなければならない理由はたくさんあります。そのプロセスを多くのリクエストにドラッグすることは悪い考えです。XSSは気になります(他のセッションやCookieのセキュリティ上の問題はもちろんです)。 @マルワン:また、IMHOの '検索ボックス'は悪い例です - ユーザーが検索する権限がない場合、検索フォームはページに表示されるべきではありません。 HTMLヘルパーは、条件付きで許可されたUI要素をレンダリングするのに素晴らしいです。 –

答えて

2

フォームの投稿値をセッションディクショナリに保存するカスタム認可属性を作成し、認可が完了した後でセッション辞書から値を再送信することができます。ここ
は一例です:

public class CustomAuth:AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var form = filterContext.HttpContext.Request.Form; 
     if (form.HasKeys()) { 
     foreach(var key in form.AllKeys) 
     { 
     filterContext.HttpContext.Session[key]= form[key]; 
     } 
     } 
     base.OnAuthorization(filterContext); 
    } 
} 

ご覧のとおり、承認前にすべてのフォームの値をセッションに格納されています。
承認が完了したら、すべての値を復元できます。

[CustomAuth()] 
public ActionResult Admin() 
{ 
    // supposing you had a from input with the name "Name" 
    string Name = Session["Name"] ?? string.Empty; 

    return View(); 
} 
関連する問題