ASP.NET MVC дилемма перенаправления на Application_AuthenticateRequest - PullRequest
3 голосов
/ 18 августа 2010

Я бы хотел, чтобы мое MVC-приложение проверяло (при каждом запросе), есть ли у текущего пользователя профиль. Если профиль не найден, я хочу перенаправить его на страницу «профиля», чтобы он отправил его.

    protected void Application_AuthenticateRequest()
    {
        if (HttpContext.Current.User != null)
        {
            // Redirect to profile page if the current user does not have a profile
            if (!HttpContext.Current.User.HasProfile())
                Response.RedirectToRoute("Profile");
        }
    }

Я расширил IPrincipal, включив в него метод "User.HasProfile ()", чтобы проверить, есть ли у пользователя профиль. Это работает, , но проблема в том, что Application_AuthenticateRequest вызывается для каждого отдельного запроса, включая javascript, css и т.д ...

Кроме того, он создает цикл перенаправления, когда я пытаюсь выполнить Response.RedirectToRoute ("Профиль").

Единственный способ, который я нашел для этого, - добавить следующее в мое выражение IF перед перенаправлением на страницу профиля:

!HttpContext.Current.User.HasProfile() && Request.Path != "/system/profile" && !Request.Path.Contains(".")

Он проверяет, является ли текущий путь страницей профиля (для предотвращения цикла перенаправления) и есть ли в URL период (чтобы позволить ресурсам javascript и css продолжать загружаться). Есть ли лучший способ? Как вы, ребята, справляетесь с этим?

1 Ответ

3 голосов
/ 21 января 2011

Я не уверен, будет ли это работать для каждого отдельного случая, но я обнаружил, что вы можете запросить свойство Handler текущего контекста, и оно равно нулю для статических ресурсов.

void LogRequestInfo(object sender, EventArgs e)
{

        HttpApplication app = (HttpApplication)sender;
        HttpContext ctx = app.Context;

        // We don't want to spend resources logging static file requests.  This code was added when we moved
        // to Integrated mode in IIS.
        if (ctx.Handler == null)
            return;

// More code below here...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...