你好,
我有一个 ASP.NET MVC 网站,最终用户可以在其中创建帐户。但是,我确实需要他们在他们第一次登录时同意,如果没有,那么他们在登录时应该无法访问该站点上的任何其他网页。
这可能吗,如果可以,怎么办?
你好,
我有一个 ASP.NET MVC 网站,最终用户可以在其中创建帐户。但是,我确实需要他们在他们第一次登录时同意,如果没有,那么他们在登录时应该无法访问该站点上的任何其他网页。
这可能吗,如果可以,怎么办?
一种简单的方法是创建自定义授权属性。下面的授权属性检查用户是否经过身份验证和授权,如果是,则您已进行 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);
}
}
}
最直接的方法是使用 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 角色才能使用控制器。