学习ASP.NET Core的身份认证(基于JwtBearer的身份认证10)

  基于Cookie传递token的主要思路是通过用户身份验证后,将生成的token保存到Response.Cookies返回客户端,后续客户端访问服务接口时会自动携带Cookie到服务端以便验证身份。之前一直搞不清楚的是服务端程序如何从Cookie读取token进行认证(一般都是将token放到header中以特定键值对形式自动验证身份),不过参考文献2中给出示例,主要是处理JwtBearerEvents.OnMessageReceived事件,该事件是接收到 protocol message时触发,此时可以从Cookie中取出token并将其赋予MessageReceivedContext.Token属性,以便支撑身份验证。主要代码如下所示:

csharp 复制代码
[HttpPost]
public async Task<ApiResult> LoginPlus([FromBody] UserInfo info)
{
    try
    {
        if (_dbClient.Queryable<AppUser>().Any(r => (r.Account == info.Name) && (r.Password == info.Password)))
        {
            AppUser curUser = _dbClient.Queryable<AppUser>().First(r => (r.Account == info.Name) && (r.Password == info.Password));
           
            ApiResult result = new ApiResult();
            result.UserName = curUser.Name;

            var cookieOptions = new CookieOptions
            {
                HttpOnly = true, 
                Secure = true, 
                Expires = DateTime.UtcNow.AddDays(7) 
            };
            Response.Cookies.Append("auth_token", GetToken(info.Name), cookieOptions);

            return result;
        }
        else
        {
            return new ApiResult("身份验证失败", 500, false);
        }
    }
    catch (Exception ex)
    {
        return new ApiResult(ex.Message, 500, false);
    }
}
csharp 复制代码
builder.Services.AddAuthentication(options =>
{
    ...
}).AddJwtBearer(options =>
{
    ...

    options.Events = new JwtBearerEvents
    {
        OnMessageReceived = context =>
        {
            var accessToken = context.Request.Cookies["auth_token"];

            if (!string.IsNullOrEmpty(accessToken))
            {
            	//Bearer Token. This will give the application an opportunity to 
            	//retrieve a token from an alternative location.
                context.Token = accessToken;
            }

            return Task.CompletedTask;
        }
    };
});

  先在postman中进行验证,如下面两图所示,调用LoginPlus后,会在客户端Cookie中存储值为auth_token的token数据。


  调用另一需授权的服务时,不需要设置header,也不需要其它操作,postman会自动携带Cookie调用服务,也能正常调用并返回数据。如果手工删除Cookie,再调用服务时则会报401错误。

参考文献:

1百度AI智能问答,搜索条件:asp.net core 通过Cookie传递token

2https://www.cnblogs.com/CreateMyself/p/15755657.html

相关推荐
李纲明2 天前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie
j7~4 天前
【Linux网络加餐】《HTTP 会话保持:Cookie 与 Session 原理及实验验证》---详解
linux·网络·网络协议·http·cookie·session
承渊政道8 天前
Linux网络学习【深入理解应用层HTTP协议、Cookie与Session机制及HTTPS协议原理】
linux·网络·学习·http·cookie·session
FungLeo11 天前
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
安当加密030113 天前
动态口令认证如何选型
身份认证·mfa·双因素认证·动态口令认证如何选型·动态口令认证
安当加密-焱垚13 天前
身份认证凭据管理系统
身份认证·凭据管理·身份认证凭据管理系统·登录认证中如何应用凭据管理系统·身份认证中如何应用凭据管理系统
躺柒13 天前
读数据安全架构设计与实践03身份认证(上)
网络安全·信息安全·数据安全·安全架构·身份认证
FungLeo14 天前
成为全栈·Flutter App 篇·Refresh Token 旋转与并发 401:安全存储与会话代次
flutter·jwt·移动安全·身份认证·token刷新·成为全栈
AIgorithmGEEK22 天前
[Linux]HTTP 应用层协议全解(下篇)
linux·网络·网络协议·http·cookie·无连接·无状态
安当加密03011 个月前
动态口令认证实施案例
身份认证·国密算法·双因素认证·动态口令·实施落地