Вы можете сохранить хэш-часть, испустив 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
Это работает просто отлично. Я не в приложении MVC, поэтому мое решение было адаптировано. 'filterContext.Result = new ContentResult {Content = html};' был возвращен к исходному решению: 'Response.ClearContent(); Response.Write (html); Response.Status = "200 OK"; Response.End(); ' –
Следует отметить, что в этом решении« REPLACEWITHURL »не является инструкцией для разработчика размещать там URL. Это строка, которую событие заменяет при записи страницы переадресации. –