从类内重定向到操作的正确方法?

2024-03-31

背景

我有一个项目分为 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();
    }
}

如果你看一下MVC源代码RedirectToAction()返回一个RedirectoToRouteResult目的。这个类正在有效地做你正在做的事情 - 调用Response.Redirect().

public override void ExecuteResult(ControllerContext context)
{
    ...

    string destinationUrl = UrlHelper.GenerateUrl(
        RouteName, null /* actionName */, null /* controllerName */, 
        RouteValues, Routes, context.RequestContext, 
        false /* includeImplicitMvcValues */);

    ...

    context.HttpContext.Response.Redirect(destinationUrl, endResponse: false);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从类内重定向到操作的正确方法? 的相关文章

随机推荐