1

对于 Asp.net Mvc 项目,当用户(应该是该网站的管理员)第一次访问该网站时,我需要将每个请求重定向到配置页面。此操作类似于默认登录页面(如果访问被拒绝,每个请求都将重定向到默认登录页面)。

用户配置配置文件后,路由表将映射到普通控制器。

附言。此页面应有助于管理员检测错误配置并易于部署。

更新 #1 我尝试在 Codeplex 上使用ASP.NET MVC WebFormRouting Demo 。但是当用户访问“~/AccessDenied.aspx”或“~/web.config”等现有页面时,我无法重定向。

routes.MapWebFormRoute("RedirectToConfig", "{*anything}", "~/App_Config");

谢谢,

4

3 回答 3

2

根据您的描述,这似乎是一个授权问题,因此我建议使用自定义 Authorize 属性类(从 AuthorizeAttribute 继承)。

从这里您可以覆盖 OnAuthorization 方法,您可以在其中检查用户是否已完成所需的配置步骤并相应地设置 filterContext.Result。一个基本的实现看起来像这样(假设你有一个有效的 /Account/Configure 路由):

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        var user = ; // get your user object

        if(user.IsConfigured == false)  // example
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                    {
                        {
                            "ConfigureUserRoute",
                            filterContext.RouteData.Values["ConfigureUserRoute"]
                        },
                        {"controller", "Account"},
                        {"action", "Configure"}
                    });
           return;
        }
    }
}

您可以在 StackOverflow 上找到有关如何在此处创建自定义 AuthorizeAttribute 类的其他示例。

于 2009-06-17T06:06:43.647 回答
1

2个想法:

  • 在您的路由表上使用一个包罗万象的规则,并在其上设置一个检查配置状态的约束
  • 将此检查的代码放在 GlobalAsax 的 Application_BeginRequest 中

包罗万象的想法的详细信息:

  • 使用 url "{*path}" 创建一个规则并将其放在列表的首位
  • 仅在尚未完成配置的情况下创建约束以激活此规则
  • 创建一个简单的控制器,例如 ConfigController,它只做一个动作RedirectToUrl("config.aspx")

但是 Application_BeginRequest 中的解决方案会更简单,因为在一个地方处理这个问题的整个代码

于 2009-06-16T06:49:27.387 回答
0

现在,我可以应用另一个问题中的技术来解决这个问题。通过在应用程序启动时在静态实例中保留一些值。请看下面的代码。

部分 ConfigBootstapper.cs

public class ConfigBootstapper
{
    public static EnableRedirectToConfigManager = false;
}

部分 ConfigModule.cs

void HttpApplication_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = sender as HttpApplication;

    if (ConfigBootstapper.EnableRedirectToConfigManager)
    {
        app.Response.Redirect("~/App_Config");
    }
}

部分 Global.asax

protected void Application_Start()
{
    [logic for setting ConfigBootstapper.EnableRedirectToConfigManager value]
}

PS。不要忘记在重定向之前检查一些导致无限循环的条件。

于 2009-06-18T10:01:35.540 回答