详解ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
程序员文章站
2023-11-18 09:30:16
在你将现有的用户登录(sign in)站点从asp.net迁移至asp.net core时,你将面临这样一个问题——如何让asp.net与asp.net core用户验证c...
在你将现有的用户登录(sign in)站点从asp.net迁移至asp.net core时,你将面临这样一个问题——如何让asp.net与asp.net core用户验证cookie并存,让asp.net应用与asp.net core应用分别使用各自的cookie?因为asp.net用的是formsauthentication,asp.net core用的是claims-based authentication,而且它们的加密算法不一样。
我们采取的解决方法是在asp.net core中登录成功后,分别生成2个cookie,同时发送给客户端。
生成asp.net core的基于claims-based authentication的验证cookie比较简单,示例代码如下:
var claimsidentity = new claimsidentity(new claim[] { new claim(claimtypes.name, loginname) }, "basic"); var claimsprincipal = new claimsprincipal(claimsidentity); await context.authentication.signinasync(_cookieauthoptions.authenticationscheme, claimsprincipal, new authenticationproperties { ispersistent = ispersistent, expiresutc = datetimeoffset.now.add(_cookieauthoptions.expiretimespan) });
生成asp.net的基于formsauthentication的验证cookie稍微麻烦些。
首先要用asp.net创建一个web api站点,基于formsauthentication生成cookie,示例代码如下:
public ihttpactionresult getauthcookie(string loginname, bool ispersistent) { var cookie = formsauthentication.getauthcookie(loginname, ispersistent); return json(new { cookie.name, cookie.value, cookie.expires }); }
然后在asp.net core登录站点中写一个web api客户端获取cookie,示例代码如下:
public class userserviceagent { private static readonly httpclient _httpclient = new httpclient(); public static async task<cookie> getauthcookie(string loginname, bool ispersistent) { var response = await _httpclient.getasync(url); response.ensuresuccessstatuscode(); return await response.content.readasasync<cookie>(); } }
最后在asp.net core登录站点的登录成功后的处理代码中专门向客户端发送asp.net formsauthentication的cookie,示例代码如下:
var cookie = await _userserviceagent.getauthcookie(loginname, ispersistent); var options = new cookieoptions() { domain = _cookieauthoptions.cookiedomain, httponly = true }; if (cookie.expires > datetime.now) { options.expires = cookie.expires; } context.response.cookies.append(cookie.name, cookie.value, options);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。