0

你好,

我有一个 ASP.NET MVC 网站,最终用户可以在其中创建帐户。但是,我确实需要他们在他们第一次登录时同意,如果没有,那么他们在登录时应该无法访问该站点上的任何其他网页。

这可能吗,如果可以,怎么办?

4

2 回答 2

1

一种简单的方法是创建自定义授权属性。下面的授权属性检查用户是否经过身份验证和授权,如果是,则您已进行 db 调用以了解用户是否已确认,如果未将私有变量设置isNotConfirmed为 true,则返回 false。

HandleUnauthorizedRequest你必须检查为什么auth。失败,如果我没有确认,那么您可以将用户重定向到确认页面。

public class CustomAuthorize : AuthorizeAttribute
  {
    bool isNotConfirmed = false;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {      
      if (base.AuthorizeCore(httpContext))
      {
        //if the user is not confirmed set isNotConfirmed true and return false;
        isNotConfirmed = true;

        // else return true;
      }

      return false;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
      if (isNotConfirmed)
      {
        filterContext.Result = new RedirectResult("/Confirm");
      }
      else
      {
        base.HandleUnauthorizedRequest(filterContext);
      }
    }
  }
于 2012-06-13T02:32:06.477 回答
0

最直接的方法是使用 ASP.Net Membership 和 Profile 提供程序。

Membership Provider提供开箱即用的基础设施来管理用户(密码、密码重置等)。

Profile Provider允许您存储有关用户的信息,包括他们是否已签署会员协议的标志。

当用户登录时,检查 Profile Provider 以查看他们是否签署了会员协议。如果他们没有,将他们重定向到适当的页面。

更新

根据您的评论,您可以执行以下操作:

编辑登录控制器

[HttpPost]
[AllowAnonymous]
public ActionResult Login(LogOnModel model, string returnUrl)
....
if (!userHasSignedTheAgreement)
{
    return RedirectToAction("Account", "ViewToAcceptAgreement");
}
else if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
    return Redirect(returnUrl);
}
else
{
    return RedirectToAction("Index", "Home");
}
....

当他们签署协议时,给他们分配一个额外的角色,比如 ConfirmedUser

然后,在访问受限的控制器中,添加以下内容:

[Authorize(Roles = "ConfirmedUser")]

该属性将强制用户必须具有 ConfirmedUser 角色才能使用控制器。

于 2012-06-12T19:33:50.890 回答