在我的项目中,我有一项功能,即每当创建新用户并登录帐户时,他必须先更改密码。
因此,如果用户是新用户,我会在登录后首先显示ChangePassowrd屏幕。菜单只有ChangePassowrd和LogOut选项。
现在,如果他输入一些只有在用户更改密码后才能访问的网站网址,则不允许这样做。有谁知道我如何实现它?我知道widnow.unload但如果直接粘贴url它不起作用。 在服务器端,我有一个BaseController,它在任何控制器之前调用(但在调用控制器的构造函数之后)进行初始化。我试图更改RouteData.Values但它没有工作。它抛出错误404未找到。代码如下:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
if (requestContext != null)
{
base.Initialize(requestContext);
if (Convert.ToString(requestContext.HttpContext.Session["UserType"]) == "3")
{
requestContext.RouteData.Values["controller"] = "Login";
requestContext.RouteData.Values["action"] = "ChangePassword";
}
}
}
答案 0 :(得分:0)
您可以在用户模型中插入新属性,这意味着扩展asp.net身份模型,并将此新属性设置为public bool passwordChanged {get;组;} 检查此属性,除非更改密码,否则不允许访问。
答案 1 :(得分:0)
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext != null && filterContext.HttpContext.Session["UserType"] != null)
{
if (Convert.ToString(filterContext.HttpContext.Session["UserType"]) == "3")
{
filterContext.RouteData.Values["controller"] = "Login";
filterContext.RouteData.Values["action"] = "ChangePassword";
}
}
}
}
答案 2 :(得分:0)
你可以通过这种方式实现这一目标。
在AppStart/FilterConfig.cs
文件中添加
filters.Add(new ChangePasswordRequiredActionFilter());
现在,您必须为该过滤器添加实现。您可以在global.asax
文件中或任何您想要的地方执行此操作:
public class ChangePasswordRequiredActionFilter: IActionFilter
{
#region Implementation of IActionFilter
public void OnActionExecuting(ActionExecutingContext filterContext)
{
string currentUrl = HttpContext.Current.Request.Url.AbsolutePath;
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
//Now you have to put your custom logic here, this is example:
User user = ourService.GetUser(blablabla);
if (user != null && !user.ChangePassword)
{
if (currentUrl != "/Account/ChangePassword" && currentUrl != "/Account/LogOff")
{
filterContext.Result = new RedirectResult("/Account/ChangePassword");
}
}
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
#endregion
}
此解决方案可确保您检查服务器的每个用户请求的条件。
答案 3 :(得分:0)
只需将用户状态设置为"未登录"直到用户同时登录并更改了密码。
如果这个问题是针对某些技术的,那么问题的提出方式并不明显。
答案 4 :(得分:0)
对于此功能,您希望您必须在ur webapp中制作自定义过滤器,如下所示......
public class ChangePasswordAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//Check user has changed password or not
if(--yes--){ nothing to do }
else{ GoToChangePasswordPage(filterContext); }
return;
}
private static void GoToChangePasswordPage(ActionExecutingContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "controller", "Login" },
{ "action", "ChangePassword" }
});
}
}
有关如何在asp.net mvc中构建自定义过滤器的更多帮助,请访问.. 1。)http://www.dotnetcurry.com/showarticle.aspx?ID=976
2)http://sampathloku.blogspot.in/2013/03/how-to-create-custom-action-filter-for.html
答案 5 :(得分:0)
最后,经过尝试,我使用BaseController中的以下代码解决它:我认为这是更简单的版本。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext != null)
{
if (Session["UserType"] != null && Convert.ToString(Session["UserType"]) == "3") // New User
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "ChangePassword", controller = "Login" }));
}
}
}