我有一个名为PasswordChangeChecker.cs
的类,它有一个从数据库返回的方法,无论用户是否更改了密码。这个方法的签名是:ASP.NET MVC:如何默认给定一定条件下的页面?
public bool IsPasswordChangedFromInitial(string IdOfUser)
其中IdOfUser
是从身份Framework用户ID字段。如果它返回true,则表示不应显示更改密码页面,否则应该导航到更改密码表单。一旦用户成功更改密码,数据库标志就会被适当设置,并且不会再提示他们再次更改密码(除非由管理员手动强制更改)。我怎样才能把这个方法在RouteConfig.cs
文件,其中目前我有:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace IdentityDevelopment
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
我如何添加一个有条件建设成为defaults
参数,这样我就可以使用IsPasswordChangedFromInitial
方法来决定是否去密码更改页面?该页面位于/Account/ChangePassword
。
编辑
按照意见,对于我的具体需要选择相应的操作方法(我省略了不相关的代码):
登录后的操作:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginModel details, string returnUrl)
{
if (ModelState.IsValid)
{
AppUser user = await UserManager.FindAsync(details.Name,
details.Password);
if (user == null)
{
AppUser userByName = await UserManager.FindByNameAsync(details.Name);
if(userByName == null)
{
ModelState.AddModelError("", "Invalid username.");
}
else
{
//If this else is reached, it means the password entered is invalid.
//code for incrementing count of failed attempts and navigation to lock out page if needed
}
}
else
{
if(user.LockedOut)
{
//navigate to locked out page
}
else
{
PasswordChangeChecker PassCheck = new PasswordChangeChecker();
string userId = user.Id.ToString();
bool proceed = PassCheck.IsPasswordChangedFromInitial(userId);
//Authorize the user
ClaimsIdentity ident = await UserManager.CreateIdentityAsync(user,
DefaultAuthenticationTypes.ApplicationCookie);
ident.AddClaims(LocationClaimsProvider.GetClaims(ident));
ident.AddClaims(ClaimsRoles.CreateRolesFromClaims(ident));
AuthManager.SignOut();
AuthManager.SignIn(new AuthenticationProperties
{
IsPersistent = false
}, ident);
//persist login into db code
if (proceed)
{
//reset failed logins count
return Redirect(returnUrl);
}
else
{
return ChangePassword();
}
}
}
}
ViewBag.returnUrl = returnUrl;
return View(details);
}
ChangePassword()获取操作:
[HttpGet]
[Authorize]
public ActionResult ChangePassword()
{
return View();
}
不知何故,返回的视图是RouteConfig.cs
而不是ChangePassword.cshtml
页面中的视图。 谢谢。
*路由用于(良好...)路由。也就是说,将Url与某个控制器/操作进行匹配。你试图完成的任务(强制执行密码策略)更多地属于* Authentication *领域。为什么不在登录时检查'IsPasswordChangedFromInitial()'? – haim770
@ haim770我的确从尝试登录,但我花了很多年试图调试为什么它进入主屏幕,而不是更改密码页,我决定尝试这是最后的手段。 – ITWorker
然后你必须提供更多的代码。您试图保护的控制器/操作是否使用'[Authorize]'属性来修饰? 'AuthorizeFilter'全局注册? – haim770