0

ASP.NetMVC3で達成したいことは次のとおりです。

ユーザーが私のウェブサイトを積極的に使用する前に、フォームに記入していくつかの詳細を提供してもらいたいと思います。そうしない限り、フォームのWebサイトにリダイレクトされます。

IsApproved-flagをfalseに設定してアカウントを登録することでこれは可能だと思いましたが、実際にはそのようなユーザーはまったくログインできません(Membership.ValidateUser(model.UserName, model.Password)常にfalseを返します)。

このシナリオをサポートするフォーム認証のメカニズムはありますか?または、カスタムデータベーステーブルでこれを追跡する必要がありますか?

前もって感謝します!

編集:MystereMan(最初に彼の返信を読んでください)とSOに関する他のいくつかの素晴らしい投稿に感謝します、ここにActionFilter(属性とその使用法)があります:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class RedirectUserInRoleAttribute : ActionFilterAttribute
{
    public string RoleName { get; set; }

    public string TargetControllerName { get; set; }

    public string TargetActionName { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        MembershipUser user = Membership.GetUser();
        if (user != null)
        {
            string[] roles = Roles.GetRolesForUser(user.UserName);

            if (roles.Any(x => x == RoleName))
            {
                RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                redirectTargetDictionary.Add("action", TargetActionName);
                redirectTargetDictionary.Add("controller", TargetControllerName);

                filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
            }
        }
    }
}


[Authorize]
[RedirectUserInRole(RoleName = "Pending", TargetControllerName = "Home", TargetActionName = "Index")]
public ActionResult ChangePassword()
{
  //...
}

[Authorize]
[RedirectUserInRole(RoleName = "Member", TargetControllerName = "Home", TargetActionName = "Index")]
public ActionResult Confirm()
{
  // show confirm form here!
}
4

2 に答える 2

1

最も簡単な解決策は、「保留中」のメンバーシップロールを作成することだと思います。アカウントを最初に作成するときに、それらを「保留中」の役割に割り当てます。次に、保留中の役割のすべてのユーザーをフォームにリダイレクトするアクションフィルターを作成できます。

編集:

注意すべきいくつかの落とし穴:

  • フォームに記入したら、必ず別の役割に再割り当てしてください
  • フォームアクション自体、またはポストアクションにリダイレクトしないようにしてください(そうしないと、無限ループになります)
  • 他の役割のユーザーがフォームに移動できないようにすることができます。
于 2012-10-23T16:01:01.447 に答える
0

その情報を自分で追跡する必要があります。提案したとおりに独自のテーブルを作成し、それをaspnet_usersテーブルにリンクするか、aspnet_usersテーブルに列を追加できます。

于 2012-10-23T07:43:56.270 に答える