如何使用MembershipUser.IsApproved进行帐户确认

时间:2012-10-23 06:42:15

标签: asp.net-mvc asp.net-mvc-3 asp.net-membership

这是我想用ASP.Net MVC 3实现的目标:

在用户积极使用我的网站之前,我希望他们填写表格并提供一些细节。除非他们这样做,否则他们会被重定向到表单网站。

我认为通过注册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!
}

2 个答案:

答案 0 :(得分:1)

我认为最简单的解决方案是创建“待定”会员角色。首次创建帐户时,请将其分配给“待处理”角色。然后,您可以创建一个Action过滤器,将过滤角色中的所有用户重定向到您的表单。

编辑:

需要注意的一些问题:

  • 确保在完成表单后将其重新分配给其他角色
  • 确保您不会在表单操作本身上重定向它们,或者它是post post(否则您将处于无限循环中)
  • 您可能希望阻止其他角色的用户导航到表单。

答案 1 :(得分:0)

您必须自己跟踪这些信息。您可以按照建议创建自己的表,并将其链接到aspnet_users表或向aspnet_users表添加一列。