C# 如何使用Razor页面在dotNet核心Web应用程序中登录用户,但将用户数据隐藏(不在Cookie中)

C# 如何使用Razor页面在dotNet核心Web应用程序中登录用户,但将用户数据隐藏(不在Cookie中),c#,asp.net,cookies,.net-core,migration,C#,Asp.net,Cookies,.net Core,Migration,首先,如果我在这里提出的问题没有多大意义,请允许我道歉。另外,谢谢你抽出时间。这是我第一次站在这里,所以我希望我做得对 我已经在Asp.Net中开发了一年了,我们使用会话在整个用户会话中保持用户数据的持久性(如电子邮件、姓名、电话、公司等)。如果我没有弄错的话,信息是隐藏的,在cookie中没有,在浏览器中也不可见 现在我们开始在.Net Core 3.1中进行开发,我负责使用这个新框架重新创建登录,条件是持久用户数据不存储在cookie中或浏览器不可见,它需要安全和隐藏 我已经查看了.Net核

首先,如果我在这里提出的问题没有多大意义,请允许我道歉。另外,谢谢你抽出时间。这是我第一次站在这里,所以我希望我做得对

我已经在Asp.Net中开发了一年了,我们使用会话在整个用户会话中保持用户数据的持久性(如电子邮件、姓名、电话、公司等)。如果我没有弄错的话,信息是隐藏的,在cookie中没有,在浏览器中也不可见

现在我们开始在.Net Core 3.1中进行开发,我负责使用这个新框架重新创建登录,条件是持久用户数据不存储在cookie中或浏览器不可见,它需要安全和隐藏

我已经查看了.Net核心会话和身份验证Cookie,但是对于这两个选项,我们都创建了保存所有信息的Cookie,在这两种方法中,信息是安全的还是易受攻击的

过了一会儿,我在Microsoft文档中发现了这个区域:

我的问题是,如果我采用这种方法,我是否可以实现我想要的,是否可以让持久的用户数据不在cookie中,或者对浏览器不可见。 如果我试图完成的是不可能的,并且需要使用cookie,那么有没有办法保持数据的保存和安全? 或者,是否有另一种方法可以确保整个会话中的数据安全且浏览器不可见

编辑: 举一个更实际的例子,在我们的仪表板中,我们将根据用户过滤数据,更准确地说,是他的类型、公司、地区和渠道,这是每个用户的属性。当用户登录并被重定向到仪表板时,他将只看到与他具有相同属性的数据。在Asp.Net中,我所需要做的就是在登录会话时保存这些信息,然后在需要时检索这些信息。 在.NETCore中,我已经能够通过两种不同的方式来使用它,第一种是使用“
HttpContext.Session.SetString()
”和“
HttpContext.Session.GetString()
”来保存和检索我需要的数据。第二种方法是在我执行“
HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new-ClaimsPrincipal(claimsIdentity),authenticationProperties);
”时在声明中传递数据。这两种方法都允许我获取并使用所需的信息。但所有数据都在cookie中,在浏览器中可见

但据我所知,.NETCore不允许在服务器端保存这样的数据,因此可以加密AuthCookie,使数据保持受保护

我登录用户的代码如下:

在对用户进行身份验证之后,我运行此命令登录用户并创建身份验证cookie

string userGUID = Guid.NewGuid().ToString();

List<Claim> claims = new List<Claim>()
{
    new Claim(ClaimTypes.NameIdentifier, userGUID),
    new Claim(ClaimTypes.Role, "Admin"),
    new Claim("Company", "User Company"),
    new Claim("Area", "User Area"),
    new Claim("Channel", "User Channel")
};

if (claims != null && claims.Count > 0)
{
    var claimsIdentity = new ClaimsIdentity(
        claims, CookieAuthenticationDefaults.AuthenticationScheme);

    AuthenticationProperties authenticationProperties = new AuthenticationProperties
    {
        IsPersistent = false,
        AllowRefresh = false,
        ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30)
    };

    _httpContextAccessor.HttpContext.SignInAsync(
               CookieAuthenticationDefaults.AuthenticationScheme, 
               new ClaimsPrincipal(claimsIdentity), 
               authenticationProperties);

}
string userGUID=Guid.NewGuid().ToString();
清单索赔=新清单()
{
新声明(ClaimTypes.NameIdentifier、userGUID),
新索赔(ClaimTypes.Role,“Admin”),
新索赔(“公司”、“用户公司”),
新索赔(“区域”、“用户区域”),
新声明(“频道”、“用户频道”)
};
if(claims!=null&&claims.Count>0)
{
var claimsIdentity=新的claimsIdentity(
声明,CookieAuthenticationDefaults.AuthenticationScheme);
AuthenticationProperties AuthenticationProperties=新的AuthenticationProperties
{
ispersist=false,
AllowRefresh=false,
ExpiresUtc=DateTimeOffset.UtcNow.AddMinutes(30)
};
_httpContextAccessor.HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
新的索赔(索赔实体),
身份验证属性);
}

再次感谢您抽出时间,请告诉我是否可以做些什么来澄清这个问题。

首先,我还没有在.Net Core中完成身份验证,但据我所知,如果我是您的情况,我将尝试按照您提到的那样使用

如果您的用户未通过外部提供商(如谷歌、Facebook等)的身份验证。。。您必须创建自己的Oauth2身份验证服务器。我在2016年做过一件事,但是在.Net Framework 4中,而不是在.Net Core中。然而,尽管现在仍然有可能,我不建议投资.Net框架,因为它将在2020年11月过时。但关于您的信息,您可以参考以下答案:

如果您想继续创建自己的OAuth提供程序,我建议您查看以下答案:

我对“饼干”的看法是,它只能储存食物。我的意思是,每次用户进行身份验证时,OAuth服务器都会提供一个令牌。此令牌应在定义的时间段内有效(比如20分钟)。那么此令牌在之后无效

为了让用户保持连接,您必须实现一种自动更新的机制。假设令牌有效期为20分钟,如果服务器在令牌仍然有效的情况下收到请求,但仅在接下来的10分钟内有效,则服务器会要求OAuth提供商续订令牌并将其返回给浏览器,以便更新其“cookie”


据我记忆所及,我们只使用Http头
授权
字段(没有cookie)在每个请求上发送令牌,并使用javascript ajax请求和本地存储在浏览器中处理其生存期(过期/续订)。

我猜您的旧登录可能使用了类似于cookie的机制。由于多前端可伸缩性问题,会话(存储在服务器端)有点不推荐使用。若你们需要在浏览器上存储敏感数据,你们可以想象一个系统用非对称算法在服务器端加密这些数据,只要你们不需要客户端的数据。数据使用场景的一个示例可能有助于更好地满足您的需求。感谢您的回复,因此,据我所知,我无法再像在Asp.Net中那样在服务器端存储和访问数据。我编辑