允许Identity Server 3从FormsAuthentication cookie验证用户

时间:2016-11-15 08:33:18

标签: identityserver3 form-authentication

我有一些应用程序和身份服务器正常工作。 我的几个旧应用程序仍在使用基于表单的身份验证,为了实现SSO,我在web.config中使用了机器密钥和域组合。

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

它帮助我实现SSO。

现在问题是在从webforms应用程序进行身份验证后,如果用户导航到我的任何新应用程序,他们会被重定向到身份以进行登录。 我想要的是,如果FormsAuthentication cookie可用,身份服务器会以任何方式验证用户身份。 现在不可能改变我的旧应用程序。

1 个答案:

答案 0 :(得分:0)

首先,请参阅我之前的问题/答案,以利用Owin中的FormsAuth票证:OWIN Self-Host CookieAuthentication & Legacy .NET 4.0 Application / FormsAuthenticationTicket

一旦您能够解密/加密FormsAuth cookie,您就可以在IdentityServer中利用它。

由于您的托管很可能与我的不同,因此请将其作为参考:

/ - &gt;我们的主要api appBuilder
/auth - &gt;我们的identityServer

我们的主API appBuilder使用cookie auth中间件,如上面关联的SO帖子(链接)中所述。

IdenityServer app组合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;
        }
    }

请注意:

  1. 以此为例。
  2. 在您的应用上启用Cookie身份验证或api 可能毫无疑问会损害您对CSRF攻击的安全性。确保您了解此攻击媒介并采取必要措施降低此风险。