表单身份验证与OWIN UseCookieAuthentication和子域SSO

时间:2016-09-20 15:51:04

标签: asp.net cookies single-sign-on owin form-authentication

“传统”表单身份验证和owin中间件(使用UseCookieAuthentication)是否完全可以互换?

我想制作一个简单的子域名sso(如许多示例所示) Sharing authentication between parent and child web applications

我的父应用程序是一个旧的asp.net webform应用程序,其表单身份验证在web.config中配置

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" name=".ASPXAUTH" protection="Validation" domain="localhost" />
   </authentication>
   <machineKey validationKey="E0230924313583BE9D071B5826165A7C6198A1697AE2F549535F0744FFDC414638882DDC507C7B097EAD5B4FB67819D9520D0A9D05B2D38EAB4AF0B36DAAA39F" decryptionKey="D29E22658319B16CAE17C9CD0269AB15DEAF9068FB6D459C" validation="SHA1" decryption="AES"></machineKey>
</system.web>

和一个子应用程序(在子域中),它是一个asp.net Mvc5(带有owin UseCookieAuthentication),所以安全性是在Startup.cs中配置的,而不是在web.config中配置的

app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                CookieName = ".ASPXAUTH",
                CookieDomain "localhost"
                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://localhost/subSiteAuthenticationTest/Account/Login" +
                        new QueryString(
                            context.Options.ReturnUrlParameter,
                            context.Request.Uri.AbsoluteUri);
            }

            context.Response.Redirect(context.RedirectUri);
        }
子应用程序web.config中的

我只为父应用程序配置了相同的机器密钥

<system.web>
    <authentication mode="None">
    <machineKey validationKey="E0230924313583BE9D071B5826165A7C6198A1697AE2F549535F0744FFDC414638882DDC507C7B097EAD5B4FB67819D9520D0A9D05B2D38EAB4AF0B36DAAA39F" decryptionKey="D29E22658319B16CAE17C9CD0269AB15DEAF9068FB6D459C" validation="SHA1" decryption="AES"></machineKey>
</system.web>

父级的登录页面用于两个应用程序(为了在我实现的“OnApplyRedirect”实现的chil应用程序中使用登录页面的绝对路径,正如这篇文章所说:Login page on different domain

但这不起作用,我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

  

“传统”表单身份验证和owin中间件(使用UseCookieAuthentication)是否完全可以互换?

不幸的是,不,它们不可互换。

但是,您可以在CookieAuthenticationOptions中提供自定义TicketDataFormat。

这是一个例子。

SSO for ASP.NET MVC4 and MVC5 web apps shared the same domain