我们已将两个ASP.NET MVC4 Web应用程序升级到MVC5,为了使用SignalR 2.x,我们不得不在更新的应用程序中使用OWIN
。这两个应用程序在web.config中共享相同的machinekey
和authentication
部分,如果用户登录app1,他们也会自动登录app 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票不应该改变。FormsAuthentication
并在我的应用程序之间共享身份验证cookie,还是应该使用OwinContext
?在web.config
的system.web
中添加以下行解决了这个问题:
<httpRuntime targetFramework="4.5" />
不确定.NET 4.5中的FormsAuthentication加密/解密方法与v4.0相比有什么变化。添加上述内容后,用户将在两个应用程序中按预期进行身份验证。