我有一个在登录表单提交后调用的方法,如果用户数据已经在我的数据库模型中验证,那么我为这个用户设置一个会话。
在此之后,我仍然需要在页面上显示一些用户数据(如导航栏上的用户名,菜单等),因此我创建了一个名为SessionContext的类,它具有与我存储在会话中相同的变量,然后我将会话值存储在这些变量中
问题是,每次一个新用户登录我的应用程序(我在IIS上托管它),任何其他登录的用户都会将他的信息替换为刚刚登录的新用户的信息。
我完全不知道怎么解决这个问题,有人有线索吗??
这是我的认证方法:
public LoginController(SessionContext userContext)
{
_userContext = userContext;
}
public object Authenticate()
{
object userAthentication = new Authentication().AuthenticateUser(username.ToUpper(), password);
if (userAthentication is Authentication data && userAthentication is not int)
{
HttpContext.Session.SetString("session[status]", "authenticated");
HttpContext.Session.SetString("session[user-login]", data.user);
HttpContext.Session.SetString("session[user-fullname]", data.name);
_userContext.Login = data.user;
_userContext.FullName = data.name;
return 200;
}
else {
return 500;
}
}
这是SessionContextClass
public class SessionContext
{
public string Login { get; set; }
public string Fullname { get; set; }
}
这就是我在Razor页面上显示用户数据的方式(当新用户登录时,这些信息将被替换)
@inject webAppPortalMedico_PFP.Models.Services.SessionContext session
<h5> Hello @session.Fullname ! </h5>
1条答案
按热度按时间xcitsw881#
不是会话被覆盖,而是您的SessionContext被覆盖
正如docuemnt提到的:
ASP.NETCore通过向客户端提供包含会话ID的Cookie来维护会话状态。Cookie会话ID:
随每个请求发送到应用程序。由应用程序用于获取会话数据。会话状态表现出以下行为:
会话cookie是特定于浏览器的。会话不跨浏览器共享。
当涉及到你的SessionContext时,如果你将它注册为transmant/scoped,那么状态将不会在不同的请求之间保持,并且从你的描述来看(其他登录的用户的信息将被刚刚登录的新用户的信息替换),你将它注册为singleton,这意味着它在你的应用中总是相同的示例
为什么不直接在View中调用
@HttpContext.Session.GetString("session[user-fullname]")
?此外,在www.example.com核心中内置了对Authentication的支持asp.net,一旦您在身份验证中间件中成功进行身份验证,您就可以获得带有代码的用户名:
HttpContext.User.Identity.Name