Ответ 1
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
LoginPath = new PathString("/account/login"),
LogoutPath = new PathString("/account/logout"),
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ApplyRedirect
},
});
}
private static void ApplyRedirect(CookieApplyRedirectContext context)
{
Uri absoluteUri;
if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri))
{
var path = PathString.FromUriComponent(absoluteUri);
if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath)
{
context.RedirectUri = "http://accounts.domain.com/login" +
new QueryString(
context.Options.ReturnUrlParameter,
context.Request.Uri.AbsoluteUri);
}
}
context.Response.Redirect(context.RedirectUri);
}
}
Если apps.domain.com является единственной базой URL-адреса возврата, вам следует серьезно подумать о замене context.Request.Uri.AbsoluteUri
на context.Request.PathBase + context.Request.Path + context.Request.QueryString
и построить абсолютный URL-адрес возврата на вашем сервере аутентификации, чтобы защитить ваши приложения от оскорбительных перенаправлений.
Надеюсь, что это поможет;)
EDIT: вы можете спросить себя, почему я не применяю прямое перенаправление, используя свойство context.RedirectUri
. Фактически, ICookieAuthenticationProvider.ApplyRedirect
отвечает за множественные перенаправления, соответствующие потокам входа и выхода (да, я знаю, это нарушает принцип единой ответственности...). Но еще хуже: context.RedirectUri
может либо представлять абсолютный URL конечной точки аутентификации в начале потока входа в систему, либо конечный пункт назначения браузера (т.е. Действительный относительный "URL-адрес возврата" ), когда файл cookie эффективно отправляется обратно браузер... поэтому нам нужно убедиться, что context.RedirectUri
является абсолютным и соответствует зарегистрированному context.Options.LoginPath
.