2017-06-27 3 views
0

J'ai lu beaucoup de messages et pendant que j'ai glané toutes les informations que je besoin je ne peux pas obtenir ce travail. Donc j'espère que quelqu'un peut me diriger dans la bonne direction. Ou si vous avez un (des) projet (s) factice (s) fonctionnel (s) encore mieux. Tous les exemples que je viens voir ne traitent pas spécifiquement avec mon exigence 2.SSO FormsAuthentication - 2 Applications - 1 x WebForms et 1 x MVC

J'ai une application WebForms existantes (W1) qui utilise FormsAuthentication. Dans le cadre de la migration vers MVC, nous voulons créer une application MVC (M1) «à côté» de celle-ci et y implémenter de nouvelles fonctionnalités. (Il est actuellement hors de portée au port de l'ensemble de l'application de W1 à MVC.) Existant FormsAuthentication doit être maintenu et utilisé pour les deux sites.

Les deux applications fonctionneront sur le même IIS mais sous différents sous-domaines:

  • w1.mydomain.com
  • m1.mydomain.com

attentes

  1. Les utilisateurs se connecter à W1 et accès une fois authentifié M1 comme urls ainsi que W1 urls
  2. l'application M1 a besoin de "savoir" quel utilisateur est connecté
  3. Déconnexion soit via W1 ou M1 consignera l'utilisateur pour l'autre application

Mis en œuvre Solution

Connexion:

  • Partager le cookie d'authentification au niveau du domaine à savoir mydomain.com
  • lors de la connexion réussie dans W1 redirigent à M1 pour régler le cookie auth utilisateur
  • Redirect retour de M1 à W1

Déconnexion:

  • W1/M1 Appel FormsAuthentication.SignOut(); puis rediriger vers l'autre côté de faire les mêmes

Configurations

W1

web.config

<machineKey decryption="AES" validation="HMACSHA256" decryptionKey="AutoGenerate" validationKey="AutoGenerate" /> 
<authentication mode="Forms"> 
    <forms loginUrl="~/account/login" timeout="120" defaultUrl="~/" domain=".mydomain.com" /> 
</authentication> 
<compilation targetFramework="4.6.1"></compilation> 
<!-- requestValidationMode needs to remain --> 
<httpRuntime targetFramework="4.6.1" requestValidationMode="2.0" 
      maxRequestLength="20480" executionTimeout="300" /> 

Contrôleur à connexion sur/compte/se connecter

<asp:Login ID="idLogin" runat="server" ViewStateMode="Disabled" DestinationPageUrl="~/sso/BounceLogin.aspx" > 

code derrière pour BounceLogin.aspx:

public partial class BounceLogin : Page 
{ 
    protected void Page_Load(object aSender, EventArgs aArgs) 
    { 
     Response.Redirect("https://m1.mydomain.com/sso/login"); 
    } 
} 

M1

web.config

<machineKey decryption="AES" validation="HMACSHA256" decryptionKey="AutoGenerate" validationKey="AutoGenerate" /> 
<compilation debug="true" targetFramework="4.6.1" /> 
<httpRuntime targetFramework="4.6.1" /> 
<authentication mode="Forms"> 
    <forms loginUrl="https://w1.mydomain.com/account/login" timeout="120" domain=".mydomain.com" /> 
</authentication> 

SSO Controller:

public class SsoController : Controller 
{ 
    [Authorize] 
    // GET: Secure 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Status() 
    { 
      return View(new ViewModel 
      { 
       TheUser = User 
      }); 
    } 

    public ActionResult Logout() 
    { 
     FormsAuthentication.SignOut(); 
     return Redirect("https://w1.mydomain.com/"); 
    } 

    public ActionResult Login() 
    { 
     FormsAuthentication.SetAuthCookie("[email protected]", false); 
     return Redirect("https://w1.mydomain.com/sso/BounceLoginReturn"); 
    } 
} 

Interactions

Voici donc ce qui se passe lorsque je me connecte avec mon utilisateur de test: [email protected] (J'ai omis le nom d'utilisateur passant à M1 pour garder le code plus simple).

A. w1.mydomain.com/account/login - Effectuer Connexion réussie et rediriger vers m1.mydomain.com/sso/login

B. m1.mydomain.com/sso/login - Ensembles cookies pour [email protected] utilisateur et redirige vers w1.mydomain.com/BounceLoginReturn

problème

Quand je retourne à w1.mydomain.com/BounceLoginReturn W1 pense toujours que je ne suis pas connecté et me redirige t o w1.mydomain.com/account/login. (Si j'ouvre M1 dans un autre onglet du navigateur, il me dit que je suis connecté en tant que [email protected])

J'ai vérifié et w1.mydomain.com et m1.mydomain.com ont la même valeur de cookie définie pour le domaine .mondomaine.com.

Alors qu'est-ce que je fais mal ici pour faire W1 pense que je ne suis pas connecté en gardant à l'esprit que je me suis connecté à l'origine via l'asp: Le contrôle de connexion qu'il contient?

+0

utilisez "decryptionKey" & "validationKey" au lieu de "AutoGenerate" et il devrait être le même dans toute l'application. Les algorithmes de validation et de déchiffrement doivent également être identiques. –

Répondre

0

Si quelqu'un d'autre a ce problème, il s'avère que la solution était simple. Mon code ci-dessus était fonctionnellement correct. J'ai cependant besoin d'utiliser des clés codées dur:

<machineKey decryption="AES" validation="HMACSHA256" decryptionKey="{Hard Coded Key Here}" validationKey="{Hard Coded Key Here}" /> 

Il y a des tas de sites là-bas pour générer ceux-ci, mais la façon la plus simple est d'utiliser IIS lui-même:

enter image description here

puis utilisez " Générer des clés "sur le côté droit.