Question Page de connexion sur un domaine différent


Je suis complètement novice en matière d'authentification OWIN, et je ne comprends pas comment tout fonctionne, mais je ne trouve rien de tel.

Tout ce que je veux, c'est pouvoir utiliser un domaine central pour l'authentification. Si quelqu'un tente d'accéder apps.domain.com Lorsqu'ils ne sont pas authentifiés, ils seront redirigés vers accounts.domain.com/login de sorte que toute l'authentification est séparée en son propre domaine et application. C'était très facile avec l'authentification par formulaires MVC 4 où vous pouvez spécifier une URL complète, mais ne semble pas être avec OWIN.

Dans Startup.Auth.cs:

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

Il est facile de spécifier le domaine lors de la configuration du cookie avec le CookieDomain option. Cependant, lorsque vous spécifiez le chemin de connexion vers lequel rediriger, il doit être relatif à l'application en cours, alors comment puis-je accomplir ce qui était si facile dans l'authentification par formulaires MVC 4?

Sans entrer dans les détails de l'authentification OWIN, je n'ai rien pu trouver après quelques heures de recherche.


35
2018-01-22 06:03


origine


Réponses:


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);
    }
}

Si apps.domain.com est la seule base d'URL de retour possible, vous devriez envisager sérieusement de la remplacer context.Request.Uri.AbsoluteUri avec context.Request.PathBase + context.Request.Path + context.Request.QueryString et créez une URL de retour absolue sur votre serveur d'authentification pour protéger vos applications contre les redirections abusives.

J'espère que cela t'aides ;)

MODIFIER: vous pouvez vous demander pourquoi je n'applique pas directement la redirection à l'aide du context.RedirectUri propriété. En réalité, ICookieAuthenticationProvider.ApplyRedirect est responsable de plusieurs redirections, correspondant aux flux de connexion et de déconnexion (oui, je sais, cela enfreint le principe de la responsabilité unique ...). Mais il y a encore pire: context.RedirectUri peut soit représenter l'URL absolue du noeud final d'authentification au début du flux de connexion, soit la destination finale du navigateur (c.-à-d. l'URL de retour relative réelle) lorsque le cookie est effectivement renvoyé au navigateur ... besoin de faire en sorte que context.RedirectUri est absolu et correspond au nominatif context.Options.LoginPath.


44
2018-01-22 09:27



Je travaille à travers les exemples pour https://github.com/IdentityServer/IdentityServer3 et j'ai une réponse différente. Dans l'exemple de https://www.scottbrady91.com/Identity-Server/Identity-Server-3-Standalone-Implementation-Part-2 ils affichent une application MVC qui utilise une authentification IdP et des cookies autonomes. L'exemple n'a pas inclus le fait de faire fonctionner les redirections 401, mais je suis tombé sur un moyen.

Le schéma de base consiste à créer une action dans le AccountController pour la connexion.

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

Maintenant, vous avez une URL locale qui peut être utilisée dans le démarrage

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

Vous avez également l'avantage supplémentaire de pouvoir ajouter un lien d'action à la connexion dans la barre de menus, pour les personnes souhaitant se connecter avant qu'il y ait un 401. Ce que nous avons fait ici est découplé de la décision à prendre lorsqu'un Un utilisateur non identifié demande une ressource sur la manière dont l'authentification est obtenue.


4
2017-12-12 07:28