1

シナリオ 私は、許可されたユーザーのみが新しい投稿を更新し、投稿にコメントできるasp.net MVC 3を使用して、管理パネルにフォーラムを構築しようとしています。以下は、PostsController のコメント機能です。

  [Authorize]
        public ActionResult Comment(int id, string name, string email, string body)
        {
            Post post = GetPost(id);
            Comment comment = new Comment();
            User CurrentUser = repository.GetUser(User.Identity.Name);
            comment.UserID = CurrentUser.ID;
            comment.Post = post;
            comment.DateTime = DateTime.Now;
            comment.Name = User.Identity.Name;
            comment.Email = email;
            comment.Body = body;
            model.AddToComments(comment);
            model.SaveChanges();
            return RedirectToAction("Details", new { id = id });

        }

問題: ログオンしていないユーザーが投稿にコメントすると、ページがログイン ページにリダイレクトされ、承認されたアクセスでログオンした後、コメント フォームの投稿値がコメント アクションによって識別されません。コメントフォームのコードは次のとおりです。

 <form action="@Href("~/Posts/Comment/" + post.ID)" method ="post">
            <input type="text" id="commentNamePrompt" name="name" />
            Name (required) 
            <br />
            <input type="text" id="commentEmailPrompt" name="email" />
            Email (optional)
            <br />
            <textarea id="commentBodyInput" name="body" rows="10" cols="60"></textarea>
            <input type="submit" id="commentSubmitInput" name="submit" value="Submit!" />
            </form>

エラー

This property cannot be set to a null value.

試してみました: 最初にサイトにログインして投稿にコメントしてみましたが、正常に動作します。ログインページとの間でリダイレクトされた後にモデルの投稿値が渡されなかったためにエラーが発生したと確信しています。許可されていないユーザーがコメントフォームの投稿値を更新して、許可されたページにリダイレクトするにはどうすればよいですか。

4

1 に答える 1

1

唯一の方法は、コメント フィールドを非表示フィールドとして別のログオン フォームに永続化することだと思います。これは、許可されていない要求をインターセプトし、コメント フィールドを使用して別のログオン ページにリダイレクトすることにより、AuthorizeAttribute で実行できます。

public class CommentAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var form = filterContext.RequestContext.HttpContext.Request.Form;
        var commentNamePrompt = form.Get("commentNamePrompt");
        var commentEmailPrompt = form.Get("commandEmailPrompt");
        var commentBodyInput = form.Get("commentBodyInput");
        var url = new UrlHelper(filterContext.RequestContext);
        var logonUrl = url.Action("LogonWithComment", "Account", new { commentNamePrompt, commentEmailPrompt, commentBodyInput });
        filterContext.Result = new RedirectResult(logonUrl);
    }
}

コメント フィールドを LogonWithComment ビューに入力して、ログオン POST の一部にすることができます。

それはきれいな解決策ではありません。可能であれば、そもそもこの状況を回避する方法を探します。

于 2012-07-01T07:21:48.070 に答える