2010-05-13 3 views
2

Каков наилучший способ проверки правильности строки запроса &? Например, после перенаправления входа я хочу убедиться, что целевой URL-адрес действителен. Если нет, перейдите на страницу по умолчанию.Проверка правильности URL-адреса и верности

У нас, похоже, проблема с запросом, начиная с «ReturnUrl =», дублируется и выдает исключение. Мы предпочли бы, чтобы он перешел на страницу по умолчанию.

ответ

1

Обходной путь слишком длинный ReturnUrl параметр querystring. Дело в том, что, если в добавлении добавлялось новое значение параметра RedirectUrl (например, с использованием метода FormsAuthentication.RedirectToLoginPage), это было бы закодировано и назначено новому параметру RedirectUrl.

Идея состоит в том, чтобы удалить ненужные (старые параметры ReturnUrl из строки запроса). Для этого я использую Application_EndRequest в global.asax и Response.RedirectLocation.

Так что если ответ перенаправляется и текущий url содержит ReturnUrl параметр, его следует удалить из перенаправленного местоположения (потому что это не имеет смысла).

// parameter key 
private static readonly string ReturnUrlParameter = "ReturnUrl"; 

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.IsRequestBeingRedirected) 
    { 
     Uri redirectUrl; 
     if (Uri.TryCreate(Response.RedirectLocation, UriKind.RelativeOrAbsolute, out redirectUrl)) 
     { 
      redirectUrl = MakeAbsoluteUriIfNecessary(redirectUrl); 
      Uri currentUrl = Request.Url; 
      var currentQueryParameters = 
        HttpUtility.ParseQueryString(HttpUtility.UrlDecode(currentUrl.Query)); 
      // the parameter is present in the current url already 
      if (currentQueryParameters[ReturnUrlParameter] != null) 
      { 
       UriBuilder builder = new UriBuilder(redirectUrl); 
       builder.Query = 
         HttpUtility.UrlDecode(builder.Query) 
          .Replace(Request.Url.Query, string.Empty).TrimStart('?'); 

       Response.RedirectLocation = 
         Request.Url.MakeRelativeUri(builder.Uri).ToString(); 
      } 
     } 
    } 
} 

private Uri MakeAbsoluteUriIfNecessary(Uri url) 
{ 
    if (url.IsAbsoluteUri) 
    { 
     return url; 
    } 
    else 
    { 
     Uri currentUrl = Request.Url; 
     UriBuilder builder = new UriBuilder(
       currentUrl.Scheme, 
       currentUrl.Host, 
       currentUrl.Port 
      ); 

     return new Uri(builder.Uri, url); 
    } 
} 

Для URL разборе и строительство System.Uri будет лучшим выбором.

URI, представляет собой компактное представление ресурса, доступного для вашего приложения в интрасети или Интернете. Класс Uri определяет свойства и методы обработки URI, и , в том числе анализ, сравнение и комбинирование . Свойства класса Uri доступны только для чтения; до создать модифицируемый объект, используйте класс UriBuilder .

+0

Я просмотрел System.Uri. К сожалению, несмотря на то, что часть повтора повторяется, uri все еще хорошо сформирован. – DenaliHardtail

0

Предположим, вы можете извлечь URL-адрес, декодировать его и загрузить его в тип «Uri». Это скажет вам, является ли это структурно обоснованным.

Смежные вопросы