1

Я использую WIF и модель безопасности с использованием ThinkTecture STS.WIF не может перенаправлять URL-адрес, содержащий хэш после федеративной аутентификации

При попытке запросить URL-адрес: http://domain.com/#page, WIF не перенаправляется на правильную страницу после аутентификации.

RU паров в wctx не содержат правильный путь /# пути. Вместо этого он игнорирует хэш и все после него, поэтому параметр ru равен /. Нормальный url без хеша отлично работает.

Есть ли тренировка вокруг этого или я неправильно форматирую URL?
Любые предложения?

ответ

1

Он выглядит как браузер, который не отправляет хэш-часть URL-адреса обратно на сервер. Я считаю, что это стандарт HTTP, поскольку хеш-часть изначально была предназначена только для привязки тегов на стороне клиента.

Есть обходные пути, использующие ajax/javascript, но поскольку я использую простой запрос GET, это кажется невозможным.

Смотрите эти аналогичные вопросы, которые объясняют проблему ...

How to get Url Hash (#) from server side

do browsers remove # in URL automatically?

1

Вот вся суть хэш-фрагментов, - что они не до конца на сервере.

3

Вы можете сохранить хэш-часть, испустив JavaScript для выполнения перенаправления, а не перенаправлять немедленно. Код JavaScript может получить доступ к хэш-части через window.location.hash и использовать его для создания ru.

Вам необходимо настроить страницу, чтобы разрешить пользователям без проверки подлинности (чтобы пассивная аутентификация WIF не срабатывала). Затем вы можете обрабатывать не прошедших проверку пользователей в код страницы.

Вы можете связать событие FederatedAuthentication.WSFederationAuthenticationModule.RedirectingToIdentityProvider в стартовом коде приложения (например, Global.asax.cs в веб-формах).

Например (Web Forms):

public class Global : HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     FederatedAuthentication.WSFederationAuthenticationModule.RedirectingToIdentityProvider 
     += this.RedirectToIdentityProviderViaJavaScript; 
    } 

    const string RedirectHtml = 
    @"<html> 
     <head> 
      <script type='text/javascript'> 
       function authenticate(url, utcTimeString) {{ 
        var ru = window.location.pathname + (window.location.hash || ''); 
        var wctx = 'rm=0&id=passive&ru=' + encodeURIComponent(ru) + '&wtc=' + encodeURIComponent(utcTimeString); 
        url += '&wctx=' + encodeURIComponent(wctx); 
        window.location = url; 
       }} 
      </script> 
     </head> 
     <body onload=""authenticate('{0}', '{1}');""> 
     </body> 
    </html>"; 

    private void RedirectToIdentityProviderViaJavaScript(object sender, RedirectingToIdentityProviderEventArgs e) 
    { 
     var fam = FederatedAuthentication.WSFederationAuthenticationModule; 
     var msg = new SignInRequestMessage(new Uri(fam.Issuer), fam.Realm); 
     var stsUrl = msg.WriteQueryString(); 
     var utcTime = WebPageRoutines.EncodeUtcTimeString(DateTime.Now); 
     var html = string.Format(RedirectHtml, WebPageRoutines.JavascriptEncode(stsUrl), WebPageRoutines.JavascriptEncode(utcTime)); 
     Response.ClearContent(); 
     Response.Write(html); 
     Response.Status = "200 OK"; 
     Response.End(); 
    } 
} 

Имейте в виду, что вы не можете смешивать? параметры с # частями с таким подходом. Ру выживает перенаправление STS (Thinktecture IdentityServer v2), но WIF, кажется, испортит его в окончательном перенаправлении после POST из STS.

Он поместит? часть после # часть.
http://www.somewebsite.com/page?param=1&other=2#hashbit
становится:
http://www.somewebsite.com/page#hashbit?param=1&other=2

2

Лучше использовать CreateSignInRequest, чтобы получить все параметры из web.config. Угадайте, что это исправляет проблему с помощью запроса.Пример с использованием MVC

 const string redirectHtml = 
      @"<!DOCTYPE html> 
       <html> 
       <head> 
        <meta charset='utf-8'> 
        <script type='text/javascript'> 
         function authenticate(url) {{ 
          var ru = window.location.pathname + (window.location.hash || ''); 
          window.location = url.replace('REPLACEWITHURL', encodeURIComponent(ru)); 
         }} 
        </script> 
       </head> 
       <body onload=""authenticate('{0}');""> 
       </body> 
      </html>"; 

     var authenticationModule = FederatedAuthentication.WSFederationAuthenticationModule; 
     var message = authenticationModule.CreateSignInRequest("passive", "REPLACEWITHURL", false); 
     var stsUrl = message.WriteQueryString(); 
     var html = string.Format(redirectHtml, HttpUtility.JavaScriptStringEncode(stsUrl)); 
     filterContext.Result = new ContentResult { Content = html }; 
+0

Это работает просто отлично. Я не в приложении MVC, поэтому мое решение было адаптировано. 'filterContext.Result = new ContentResult {Content = html};' был возвращен к исходному решению: 'Response.ClearContent(); Response.Write (html); Response.Status = "200 OK"; Response.End(); ' –

+0

Следует отметить, что в этом решении« REPLACEWITHURL »не является инструкцией для разработчика размещать там URL. Это строка, которую событие заменяет при записи страницы переадресации. –

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

  • Нет связанных вопросов^_^