在OWIN中共享旧版FormsAuthentication cookie

时间:2019-03-19 10:00:02

标签: authentication asp.net-mvc-5 owin forms-authentication

我们已经将两个ASP.NET MVC4 Web应用程序升级到了MVC5,为了使用SignalR 2.x,我们必须在更新的应用程序中使用OWIN。 这两个应用程序在web.config中共享相同的machinekeyauthentication部分,并且如果用户已登录到app1,则它们也将自动登录到应用程序2:

<machineKey validationKey="<themachinekey>" decryptionKey="<thedecryptionKey>" validation="SHA1" decryption="AES" />
<authentication mode="Forms">
  <forms timeout="2880" name=".ASPAUTH_VOCC" path="/" />
</authentication>

在对用户进行身份验证时,两个应用程序都以相同的方式直接创建身份验证票证/ cookie:

string userData = "ApplicationSpecific data for this user.";

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,
    userName,
    DateTime.Now,
    DateTime.Now.AddMinutes(2880),
    persistent,
    userData,
    FormsAuthentication.FormsCookiePath);

// Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
if (persistent)
{
    cookie.Expires = DateTime.Now.AddMinutes(2880);
}

// Create the cookie.
HttpContext.Current.Response.Cookies.Add(cookie);

我还应该提到,在更新过程中,我在启动时没有使用app.UseCookieAuthentication方法,而是更喜欢使用上述代码进行身份验证。

虽然此方法在MVC4上可以正常使用,但更新后,两个Web应用程序的行为都好像来自另一个应用程序的身份验证cookie无效,并且当用户在一个应用程序中进行身份验证时,它们仍未在另一个应用程序中进行身份验证。

  • 为什么两个应用程序之间不再接受身份验证票?我的理解是,我坚持使用传统的FormsAuthentication方法,并且应该不会更改从cookie解密auth票证。
  • 我可以在OWIN兼容的Web应用程序中使用FormsAuthentication并在应用程序之间共享身份验证cookie,还是应该使用OwinContext

1 个答案:

答案 0 :(得分:0)

web.config的{​​{1}}中添加以下行解决了该问题:

system.web

与v4.0相比,不确定.NET 4.5中FormsAuthentication加密/解密方法中进行了哪些更改。添加上述内容后,将在两个应用程序中按预期对用户进行身份验证。