如何使用 MVC 5 在基于令牌的身份验证中检查用户是不是从控制器登录?

Posted

技术标签:

【中文标题】如何使用 MVC 5 在基于令牌的身份验证中检查用户是不是从控制器登录?【英文标题】:How to check whether user is logged in or not from controller in Token Based Authentication using MVC 5?如何使用 MVC 5 在基于令牌的身份验证中检查用户是否从控制器登录? 【发布时间】:2019-07-19 04:40:36 【问题描述】:

我在HomeController 中有ActonResult Data(),我想显示 Data.cshtml 唯一已登录的用户。否则,它将返回 LogoutView.cshtml 页面

HomeController

public ActionResult Data()
    
        bool isAuthenticated = User.Identity.IsAuthenticated;
        if(isAuthenticated)
        
            return View();
        
        else
        
            return View("LogoutView");
        
    

我在 MVC5 中使用基于令牌的身份验证。

    我可以毫无问题地登录。

    在我登录之前,我尝试去 http://localhost/Poject1/home/data,它显示 LogoutView.cshtml 符合我的预期。

    登录后,我尝试访问相同的链接http://localhost/Poject1/home/data,它也显示了Data.cshtml

    但是我确实使用下面的代码注销了,然后我尝试访问http://localhost/Poject1/home/data,但它仍然显示Data.cshtml

<input id="btnLogout" type="button" value="Logout" />
<script type="text/javascript">
    $(document).ready(function () 
        $('#btnLogout').click(function () 
            console.log('Get Token = '+sessionStorage.getItem('accessToken'))
            sessionStorage.removeItem('accessToken');
            console.log('After remove Token = ' + sessionStorage.getItem('accessToken'))   // it print null
        );
    )
</script>

登录脚本

<script type="text/javascript">
    $(document).ready(function () 
        $('#btnSignIn').click(function () 
            var loginData = 
                grant_type: 'password',
                username: $('#txtSignInEmail').val(),
                password: $('#txtSignInPassword').val()
            ;

            $.ajax(
                type: 'POST',
                url: 'Token',
                data: loginData
            ).done(function (data) 

                console.log('Username =='+data.userName);

                $('#user').text(data.userName)
                $('#UserName').text(JSON.stringify(data.userName));
                // Cache the access token in session storage.
                console.log('Login Success');
                sessionStorage.setItem('accessToken', data.access_token);
            ).fail(function (showError) 
                $('#signInError').text(JSON.stringify(showError));
            );
        );
    )
</script>

【问题讨论】:

因为您在客户端使用 javascript 从 sessionStorage 中删除密钥,所以服务器不知道用户是否已注销。您必须在 $('#btnLogout').click 中调用控制器操作方法并在服务器上注销用户。 @PriyankPanchal 那么我该怎么做呢? 请编辑您的问题以分享您的登录方法的代码。 @PriyankPanchal 你现在可以查看我的更新吗?.. 我们需要您的服务器端登录方法。 【参考方案1】:

you can use Autherize Filter on controller level as well as you use this filter on Action Level. you can also customize it.

【讨论】:

欢迎来到 Stack Overflow。请详细说明您的答案并使用正确的格式***.com/help/how-to-answer

以上是关于如何使用 MVC 5 在基于令牌的身份验证中检查用户是不是从控制器登录?的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是在 ASP.NET Core 中使用基于令牌的身份验证登录

混合身份验证 - 基于 Spring MVC 会话 + 基于 JWT 令牌

MVC 5 身份验证

REST API 中基于令牌的身份验证

在 Angular2/4/5 中,如何基于基于令牌的身份验证安全地调用 WebAPI 操作

Laravel Tymon\JWT Auth:在身份验证之前检查未完成的有效令牌?