详解ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
在你将现有的用户登录(SignIn)站点从ASP.NET迁移至ASP.NETCore时,你将面临这样一个问题——如何让ASP.NET与ASP.NETCore用户验证Cookie并存,让ASP.NET应用与ASP.NETCore应用分别使用各自的Cookie?因为ASP.NET用的是FormsAuthentication,ASP.NETCore用的是claims-basedauthentication,而且它们的加密算法不一样。
我们采取的解决方法是在ASP.NETCore中登录成功后,分别生成2个Cookie,同时发送给客户端。
生成ASP.NETCore的基于claims-basedauthentication的验证Cookie比较简单,示例代码如下:
varclaimsIdentity=newClaimsIdentity(newClaim[]{newClaim(ClaimTypes.Name,loginName)},"Basic"); varclaimsPrincipal=newClaimsPrincipal(claimsIdentity); awaitcontext.Authentication.SignInAsync(_cookieAuthOptions.AuthenticationScheme, claimsPrincipal, newAuthenticationProperties { IsPersistent=isPersistent, ExpiresUtc=DateTimeOffset.Now.Add(_cookieAuthOptions.ExpireTimeSpan) });
生成ASP.NET的基于FormsAuthentication的验证Cookie稍微麻烦些。
首先要用ASP.NET创建一个WebAPI站点,基于FormsAuthentication生成Cookie,示例代码如下:
publicIHttpActionResultGetAuthCookie(stringloginName,boolisPersistent) { varcookie=FormsAuthentication.GetAuthCookie(loginName,isPersistent); returnJson(new{cookie.Name,cookie.Value,cookie.Expires}); }
然后在ASP.NETCore登录站点中写一个WebAPI客户端获取Cookie,示例代码如下:
publicclassUserServiceAgent { privatestaticreadonlyHttpClient_httpClient=newHttpClient(); publicstaticasyncTask<Cookie>GetAuthCookie(stringloginName,boolisPersistent) { varresponse=await_httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); returnawaitresponse.Content.ReadAsAsync<Cookie>(); } }
最后在ASP.NETCore登录站点的登录成功后的处理代码中专门向客户端发送ASP.NETFormsAuthentication的Cookie,示例代码如下:
varcookie=await_userServiceAgent.GetAuthCookie(loginName,isPersistent); varoptions=newCookieOptions() { Domain=_cookieAuthOptions.CookieDomain, HttpOnly=true }; if(cookie.Expires>DateTime.Now) { options.Expires=cookie.Expires; } context.Response.Cookies.Append(cookie.Name,cookie.Value,options);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。