Подтвердить что ты не робот

Страница входа в другой домен

Я совершенно не знаком с аутентификацией OWIN, и я должен неправильно понимать, как все работает, но я не могу найти это нигде.

Все, что я хочу, это использовать центральный домен для аутентификации. Если кто-то пытается получить доступ к apps.domain.com, если не аутентифицирован, они будут перенаправлены на accounts.domain.com/login, чтобы вся аутентификация была разделена на собственный домен и приложение. Это было очень просто с аутентификацией форм MVC 4, где вы можете указать полный URL-адрес, но, похоже, не с OWIN.

В Startup.Auth.cs:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    LoginPath = new PathString("/account/login")
}

Легко указать домен при настройке файла cookie с опцией CookieDomain. Однако, когда вы указываете путь для входа в систему для перенаправления, он должен быть относительно текущего приложения, поэтому как мне решить, что было так легко в аутентификации форм MVC 4?

Не углубляясь в то, что такое проверка подлинности OWIN, я не мог найти ничего, что могло бы решить эту проблему через пару часов поиска.

4b9b3361

Ответ 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.

Ответ 2

Я работаю над примерами https://github.com/IdentityServer/IdentityServer3, и у меня есть другой ответ. В примере https://www.scottbrady91.com/Identity-Server/Identity-Server-3-Standalone-Implementation-Part-2 они показывают приложение MVC, которое использует автономную аутентификацию IdP и cookie. В этом примере не было включено перенаправление 401 перенаправлений, но я наткнулся на способ.

Основная схема заключается в создании действия в AccountController для входа в систему.

public ActionResult SignIn() {
  // set up some bookkeeping and construct the URL to the central auth service
  return Redirect(authURL);
}

Теперь у вас есть локальный URL-адрес, который можно использовать в Startup

public class Startup {
  public void Configuration(IAppBuilder app) {
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
      AuthenticationType = "Cookies",
      LoginPath = new PathString("/Account/SignIn")
    });
}

У вас также есть дополнительное преимущество, которое вы можете поместить ссылку действия в SignIn в строке меню, для людей, которые хотят войти в систему до того, как появится 401. Что мы здесь сделали, это развязано решение о том, что делать, когда неаутентифицированный пользователь запрашивает ресурс, как получить аутентификацию.