欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。