背景
我有一个项目分为 Webform 和 MVC(谢天谢地,正在转向 MVC)。
我有一个LoginManager
包含一个类IRedirectionManager
类,并根据用户属性(已通过身份验证、密码过期、尚未接受条款)调用重定向管理器上的不同方法(RedirectToLogin、RedirectToAcceptTerms 等)
我正在努力为我们的 MVC 控制器构建和实现“重定向管理器”。
问题
- 这应该是 ActionFilter 还是基类?看来我可以使用其中任何一个,但不确定是否确实如此。
- 在 MVC 中重定向到操作或路由的正确方法是什么?对于网络表单重定向管理器,我传入响应对象并使用
Response.Redirect
到达该页面。我很想能够使用类似的东西RedirectToAction
等来完成这项工作。
Code
如果它有助于澄清。这LoginManager
:
public class LoginManager
{
private IRedirectManager _redirectManager;
private string _returnUrl;
private ClaimsIdentity _currentUser;
public LoginManager(string attemptingToAccessUrl, ClaimsIdentity identity, IRedirectManager redirectManager)
{
if (redirectManager == null) { throw new ArgumentNullException("redirectManager"); }
if (identity == null) { throw new ArgumentNullException("identity"); }
_redirectManager = redirectManager;
_currentUser = identity;
_returnUrl = attemptingToAccessUrl;
}
public void CheckLoginAndRedirect()
{
if (!_currentUser.IsAuthenticated)
{
if (string.IsNullOrWhiteSpace(_returnUrl)) { _redirectManager.RedirectToLogin(); }
else { _redirectManager.RedirectToLogin(_returnUrl); }
}
if (_currentUser.IsDisabled()) { _redirectManager.RedirectToDisabled(); }
if (UserRequiresPasswordReset()) { _redirectManager.RedirectToResetPassword(_returnUrl); }
if (!_currentUser.HasAcceptedTerms()) {
if (_currentUser.IsExternalUser()){ _redirectManager.RedirectToTermsAcceptance(_returnUrl); }
}
if (PasswordIsAboutToExpire())
{
if (!_currentUser.HasDeclinedToChangePassword()) { _redirectManager.RedirectToPasswordExpiringSoon(_returnUrl); }
}
}
}
这是一个例子WebFormsRedirectManager
:
public class WebFormsRedirectManager : IRedirectManager
{
private HttpContext _httpContext;
public WebFormsRedirectManager(HttpContext currentHttpContext)
{
if (currentHttpContext == null) { throw new ArgumentNullException("currentHttpContext");}
_httpContext = currentHttpContext;
}
public void RedirectToLogin()
{
_httpContext.Response.Redirect("~/AccountManagement/Login");
}
}
以及我如何在我的应用程序中使用它的一个例子ProtectedPage
类,其他 Web 表单页面继承自:
public class ProtectedPage : BasePage
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var redirector = new WebFormsRedirectManager(Context);
new LoginManager(null, ClaimsPrincipal.Current.Identity as ClaimsIdentity, redirector).CheckLoginAndRedirect();
}
}