检查用户是否已在客户端登录

Check if user has logged in on client side

本文关键字:客户端 登录 用户 是否 检查      更新时间:2023-09-26

有没有一种安全的方法可以检查用户是否已登录应用程序,而不是检查用户机器中是否存在"sid"cookie?

我想允许用户仅在登录后继续访问页面上的某些链接。

我在服务器端进行登录验证,但想避免请求跳闸。

纯JS或JQuery解决方案将不胜感激。

谢谢。

请尝试这个

将此代码放在用户首次登录后

jQuery(window).load(function() {
  sessionStorage.setItem('status','loggedIn') 
});

当用户点击链接时,您可以检查喜欢

if (sessionStorage.getItem('status') != null))
    //redirect to page
}
else{
    //show validation message
}

当你要求一个"安全的方式"时:不。应始终在服务器端验证用户会话的所有请求。

不过,您可以做的是使前端适应用户的当前状态。例如,将"登录"链接更改为"注销"链接。为此,您可以在用户计算机上设置一些旗帜之王。您可以使用浏览器本地存储来执行此操作(http://www.w3schools.com/html/html5_webstorage.asp(。

例如

,您可以做的其他事情是更改例如链接的行为:

$("a").click(function(e){
    if(localStorage.getItem("isLoggedIn") !== true) {
        e.preventDefault();
        // this prevents navigation and you can now do your js stuff here
    }
});

如果您使用的是 ASP.Net 身份,则可以按如下方式进行检查

在剃刀中:

@inject SignInManager<ApplicationUser> SignInManager
@if (SignInManager.IsSignedIn(User))
        {
            <input type="hidden" id="logged" value="true" />
        }
        else
        {
            <input type="hidden" id="logged" value="false" />
        }

在 JS 中:

function check() {
var signed = $('#logged').val();
if (signed === 'true') {
    //What you want to do
}
else {
    window.location.href = "/YourController/YourAction?ReturnUrl=/YourReturnUrl;
}
} 

它应该 100% 有效

将此代码放在用户登录页面(登录页面下一页(

jQuery(window).load(function() {
  sessionStorage.setItem('status','loggedIn') 
 });

当用户点击链接时,您可以使用以下代码检查任何页面(任何页面(

if (sessionStorage.getItem('status') != null){
//redirect to page
alert("Is Login : True");
 }
 else{
  //show validation message
 alert("Is Login : False");
 }
在我看来,您应该将带有

过期日期的authToken保存到本地存储中,然后在每次请求某些内容时检查它是否过期(不包括 GET(,并与服务器验证authToken是否已过期。 2 种验证方式。

客户端到客户端

和客户端到服务器。两者将正确匹配。

解决方案是将此信息作为会话变量存储在服务器上(使用 php(,然后使用 ajax 在 javascript 中检索此信息。

我将分享我的客户端验证方法,同时减少对服务器的调用次数。使用会话存储进行验证不是一个好方法 imo,因为它不在选项卡之间共享。

  1. 当用户登录到您的网站并将请求发送到您的服务器时,生成一个 JWT 令牌,将有效负载作为他们的电子邮件 ID,并将其作为 cookie/json 响应发送到客户端。

  2. 如果您希望 JWT 令牌作为响应,请使用唯一名称(例如 myAdminAccessToken(将 JWT 令牌保存在本地存储中,这样它就不会干扰浏览器中的其他密钥。响应中的cookie是一种更好,更强大的方法,然后存储JWT令牌

  3. 现在,每次您的用户向您的服务器发出网络请求时,在进行网络调用(获取 url(之前,请检查令牌是否存在在本地存储中,如果不存在,则他们未获得授权并将他们重定向到登录页面。 如果存在,则允许他们对您的服务器进行网络调用。

  4. 解析 cookie/JWT 令牌并验证电子邮件是否存在,则表示他们已获得授权发送 authorsed:true 作为响应,并让他们从您的服务器获取请求资源。

  5. 如果不存在此类电子邮件或 JWT 令牌解析失败,则意味着他们未获得授权,并且他们试图绕过您的第一次验证检查,即步骤 #3。

  6. 在这种情况下,从您的
  7. 服务器发送授权:错误响应,在收到失败的授权后,您的客户端应将其注销并重定向到登录页面,并从本地存储中删除accessToken。

我没有纯粹的JS或jQuery代码,但如果你愿意,我可以与你分享React代码,解释上述过程。

优化

您甚至可以优化上述解决方案,以获得更强大、更安全的应用程序。

  • 使用 Redis 缓存用户电子邮件以进行快速验证。
  • 使用状态管理库提供额外的保护层,并使 UI 同步。
本地存储、

会话存储、状态管理库对于保护路由/数据并不可靠,但它们可用于减少对服务器的网络调用数量。