2016-11-15 1 views
0

Ich habe einige Anwendungen und einen Identitätsserver, die einwandfrei funktionieren. Einige meiner alten Anwendungen verwenden noch die formularbasierte Authentifizierung und zum Erreichen von SSO verwende ich Maschinenschlüssel und Domänenkombinationen in meiner web.config.Erlaube dem Identity Server 3 den Benutzer von FormsAuthentication cookie zu authentifizieren

<authentication mode="Forms"> 
    <forms name="SSO" 
     loginUrl="http://site1.example.com/login.aspx" 
     defaultUrl="http://example.com" 
     domain="example.com" slidingExpiration="true"> 
    </forms> 
</authentication> 
<machineKey validationKey="35D679385CE8" decryptionKey="55D456A" 
    validation="HMACSHA256" decryption="AES" /> 

Es hilft mir, SSO zu erreichen.

Nun ist das Problem, nachdem authentifiziert von Webforms-Anwendung, wenn der Benutzer zu einer meiner neuen Anwendung navigiert sie für die Anmeldung zur Identität umgeleitet wurden. Was ich will ist, gibt es eine Möglichkeit, dass Identity Server Benutzer authentifizieren, wenn FormsAuthentication Cookie verfügbar ist. Es ist nicht möglich, meine alten Anwendungen zu ändern.

Antwort

0

Zuerst sehen meine vorherige Frage/Antwort FormsAuth Tickets in Owin zu nutzen: OWIN Self-Host CookieAuthentication & Legacy .NET 4.0 Application/FormsAuthenticationTicket

Wenn Sie die Möglichkeit haben, zu entschlüsseln/verschlüsseln Sie Ihre FormsAuth Cookie, Sie, dass in IdentityServer nutzen können.

Da Ihr Hosting meisten ist wahrscheinlich anders als meine, verwenden Sie diese als Referenz:

/ -> unsere api AppBuilder
/auth -> unsere identityServer

Unser Haupt API AppBuilder die Cookie-auth verwendet Middleware, wie im zugehörigen SO-Post (Link) oben beschrieben.

IdenityServer App Zusammensetzung root:

appBuilder.Map("/auth", idsrvApp => 
{ 
    idsrvApp.Use((context, task) => 
    { 
     // since we can authenticate using "Cookies" auth, 
     // we must add the principal to the env so we can reuse it in the UserService 
     // oddly, the Context.Authentication.User will clear by the time it gets there and we can't rely on it 
     // my best guess is because IdentityServer is not authenticated (no cookie set) 
     if (context.Authentication.User != null && context.Authentication.User.Identity.IsAuthenticated) 
      context.Environment.Add("auth.principal", context.Authentication.User); 

     return task.Invoke(); 
    }); 

    idsrvApp.UseIdentityServer(isOptions); 
}); 

UserService.cs

public async Task PreAuthenticateAsync(PreAuthenticationContext context) 
    { 
     // if we already have an authenticated user/principal then bypass local authentication 
     if (_Context.Authentication.User.Identity.IsAuthenticated || 
      _Context.Environment.ContainsKey("auth.principal")) 
     { 
      var principal = _Context.Authentication.User.Identity.IsAuthenticated 
       ? _Context.Authentication.User 
       : (ClaimsPrincipal)_Context.Environment["auth.principal"]; 

      context.AuthenticateResult = 
       new AuthenticateResult(); // set AuthenticateResult 

      return; 
     } 
    } 

Bitte beachten Sie:

  1. verwenden als Beispiel.
  2. Aktivieren Sie die Cookie-Authentifizierung in Ihrer App oder api MAY gefährden Sie Ihre Sicherheit CSRF-Angriffe ahnungslos. Stellen Sie sicher, dass Sie diesen Angriffsvektor kennen und ergreifen Sie die erforderlichen Maßnahmen, um dieses Risiko zu verringern.
Verwandte Themen