2016-11-15 8 views
0

У меня есть некоторые приложения и сервер идентификации, которые работают отлично. Пара моих старых приложений по-прежнему использует проверку подлинности на основе форм и для достижения SSO. Я использую машинные ключи и комбинации доменов в своем web.config.Разрешить серверу удостоверений 3 аутентифицировать пользователя из файла cookie FormsAuthentication

<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" /> 

Это помогает мне достичь единого входа.

Теперь проблема заключается в том, чтобы получить аутентификацию из приложения webforms, если пользователь перейдет к любому из моих новых приложений, они были перенаправлены на личность для входа. Я хочу, чтобы какой-либо способ аутентификации пользователя аутентифицировал пользователя, если доступен файл cookie FormsAuthentication. Невозможно изменить мои старые приложения.

ответ

0

Во-первых, см мой предыдущий вопрос/ответ использовать FormsAuth Билеты в Owin: OWIN Self-Host CookieAuthentication & Legacy .NET 4.0 Application/FormsAuthenticationTicket

После того, как у вас есть возможность расшифровывать/зашифровать FormsAuth печенье, вы можете использовать, что в IdentityServer.

Поскольку ваш хостинг, скорее всего, отличается от моего, использовать это в качестве справки:

/ -> нашего главного апи AppBuilder
/auth -> нашего identityServer

Нашего главный API AppBuilder использует куки AUTH промежуточное программное обеспечение, как описано в связанной записи SO (ссылка) выше.

IdenityServer корень приложение Состав:

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

Обратите внимание:

  1. Используйте это в качестве примера.
  2. Включение файла cookie для вашего приложения или api MAY ничего не подозревает о вашей безопасности для атак CSRF. Убедитесь, что вы знаете об этом векторе атаки и предпримите необходимые шаги для снижения этого риска.