Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Azure Application Insights 中记录用户身份信息

在 Azure Application Insights 中记录用户身份信息

作者头像
Edi Wang
发布于 2021-08-23 08:16:37
发布于 2021-08-23 08:16:37
1.1K0
举报
文章被收录于专栏:汪宇杰博客汪宇杰博客

导语

Azure Application Insights 是一个非常强大的 APM 工具,用于监视 Web 应用程序。但是,并非我们需要的所有功能都是开箱即用的。例如,为了记录请求和响应正文,我们必须写一个自定义 ASP.NET Core 中间件,就像这篇文章说的那样。

我现在有一个使用 JWT 身份验证的 ASP.NET Core Web API 应用程序。当请求失败时,我想记录用户的身份以便调试。让我们看看如何操作吧~

https://www.azureblue.io/how-to-log-http-request-body-with-asp-net-core-application-insights/

扩展原版 Middleware

我需要修改来自 https://www.azureblue.io/how-to-log-http-request-body-with-asp-net-core-application-insights 的 ASP.NET Core Middleware。

原始代码将请求正文作为自定义属性(Custom Property)记录到 Azure Application Insights。

public class RequestBodyLoggingMiddleware : IMiddleware

{

public async Task InvokeAsync(HttpContext context, RequestDelegate next)

{

var method = context.Request.Method;

context.Request.EnableBuffering();

if (context.Request.Body.CanRead && (method == HttpMethods.Post || method == HttpMethods.Put))

{

using var reader = new StreamReader(

context.Request.Body,

Encoding.UTF8,

detectEncodingFromByteOrderMarks: false,

bufferSize: 512, leaveOpen: true);

var requestBody = await reader.ReadToEndAsync();

context.Request.Body.Position = 0;

var requestTelemetry = context.Features.Get<RequestTelemetry>();

requestTelemetry?.Properties.Add("RequestBody", requestBody);

}

await next(context);

}

}

我的 JWT 身份验证将用户属性添加到Claim中。

var claims = new List<Claim>

{

new("UserId", user.Id.ToString()),

new(ClaimTypes.Name, user.DisplayName),

new(ClaimTypes.Email, request.Email),

new(ClaimTypes.AuthenticationMethod, "Password"),

new("LastLoginTimeUtc", user.LastLoginTimeUtc.ToString())

};

这些Claim 可以从 HttpContext.User 属性获取。

因此,将用户信息记录到 Application Insights 中非常简单,只需从 Claims 中获取值并将它们序列化为 JSON

if (context.User.Identity is { IsAuthenticated: true })

{

var userId = Guid.Parse(context.User.FindFirst(p => p.Type == "UserId")?.Value ?? string.Empty);

var userName = context.User.Identity?.Name;

var email = context.User.FindFirst(p => p.Type == ClaimTypes.Email)?.Value;

requestTelemetry?.Properties.Add("MpsUser", JsonSerializer.Serialize(new

{

userId,

userName,

email

}, MpsJsonSerializerOptions.Default));

}

最终的代码看起来像这样

public async Task InvokeAsync(HttpContext context, RequestDelegate next)

{

var method = context.Request.Method;

context.Request.EnableBuffering();

if (context.Request.Body.CanRead && (method == HttpMethods.Post || method == HttpMethods.Put))

{

using var reader = new StreamReader(

context.Request.Body,

Encoding.UTF8,

detectEncodingFromByteOrderMarks: false,

bufferSize: 512, leaveOpen: true);

var requestBody = await reader.ReadToEndAsync();

context.Request.Body.Position = 0;

var requestTelemetry = context.Features.Get<RequestTelemetry>();

requestTelemetry?.Properties.Add("RequestBody", requestBody);

if (context.User.Identity is { IsAuthenticated: true })

{

var userId = Guid.Parse(context.User.FindFirst(p => p.Type == "UserId")?.Value ?? string.Empty);

var userName = context.User.Identity?.Name;

var email = context.User.FindFirst(p => p.Type == ClaimTypes.Email)?.Value;

requestTelemetry?.Properties.Add("MpsUser", JsonSerializer.Serialize(new

{

userId,

userName,

email

}, MpsJsonSerializerOptions.Default));

}

}

await next(context);

}

还有一个地方我们需要注意。因为中间件需要获取用户信息,所以必须放在认证授权中间件之后。

app.UseAuthentication();

app.UseAuthorization();

app.UseRequestBodyLogging();

app.UseResponseBodyLogging();

有了这些,我们现在可以看到用户身份被记录到 Azure Application Insights 上。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 汪宇杰博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
吐槽一下Abp的用户和租户管理模块
聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息。
有态度的马甲
2020/11/09
1.5K0
吐槽一下Abp的用户和租户管理模块
.net core 认证与授权(一)
.net core web并不是一个非常新的架构,很多文章提及到认证与授权这个过程,但是一般都会提及到里面的方法怎么用的,而不是模拟一个怎样的过程,所以我打算记录自己的理解。 什么是认证?我们大学毕业有学士证书和毕业证书,来证明你是一个学士。 什么是授权,比如说你被认证是我的朋友后,你可以拿着这个身份,可以进入我的朋友圈看动态。 那么.net core 的认证与授权是一个什么样的过程,在这里提出简单模式是我给你颁发了证书,证明了你的身份,然后呢,你可以拿到你的身份卡之后,你要经过验证,得到授权,然后进入中华人民共和国,就是这个过程。 正文部分均为我的理解,可能存在误差,如果不对请指正。
梁规晓
2020/02/19
6810
.net core 认证与授权(一)
ASP.NET Core Authentication and Authorization
最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1,项目启动的时候直接报错:
MJ.Zhou
2020/04/08
1.2K0
ASP.NET Core Authentication and Authorization
实战解读ASP.NET Core身份认证
显而易见,一个常规的身份认证用例包括两部分: ① 对用户进行身份验证 ② 在未经身份验证的用户试图访问受限资源时作出反应
有态度的马甲
2020/10/10
1.8K0
实战解读ASP.NET Core身份认证
完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
在我的项目中有mvc controller(view 和 razor Page)同时也有webapi,那么就需要网站同时支持2种认证方式,web页面的需要传统的cookie认证,webapi则需要使用jwt认证方式,两种默认情况下不能共存,一旦开启了jwt认证,cookie的登录界面都无法使用,原因是jwt是验证http head "Authorization" 这属性.所以连login页面都无法打开.
阿新
2022/05/06
1.3K0
完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证
JWT 身份验证是保护 API 的标准方法之一。这允许无状态身份验证,因为签名令牌是在客户端和服务器之间传递的。在 .NET 8 中,使用 JWT 令牌的方式得到了改进。将它们与 AppUser 类集成将为您的应用程序提供无缝身份验证。本文介绍了在 .NET 8 Web 应用程序中通过 AppUser 类实现 JWT 令牌身份验证的过程。
郑子铭
2024/12/23
4470
在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证
ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
  在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore 这个项目中,我将使用 Jwt 的方式实现对于用户的权限管控,在本章中,我将演示如何使用 Jwt 实现对于用户的授权、鉴权。
程序员宇说
2019/09/11
2.4K0
ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
ASP.NETCore小技巧:使用测试用户中间件
哈喽大家好,这篇文章其实很早就想写了,因为一直会有小伙伴问到,但是我却始终拿不到好的方案,最近在录制《eShopOnContainer微服务架构》的视频,碰巧就看到了微软官方的代码中也有这方面的需求,而且和我的需求不谋而合,那我就抄一下吧,当然要适当的做些修改,可见还是要多学习一些框架的。
老张的哲学
2022/04/11
5710
ASP.NETCore小技巧:使用测试用户中间件
ASP.NET MVC 5 Authentication Breakdown
In my previous post, "ASP.NET MVC 5 Authentication Breakdown", I broke down all the parts of the new ASP.NET MVC authentication scheme. That's great, but I didn't have a working example that you, a curious developer, could download and play around with. So
阿新
2018/04/12
9650
给公众号接入FastWiki智能AI知识库,让您的公众号加入智能行列
在FastWiki.Service项目中的Service目录创建WeChatService用于实现微信公众号接入功能,具体代码如下,
用户10786849
2024/05/18
1950
给公众号接入FastWiki智能AI知识库,让您的公众号加入智能行列
ABP入门系列(10)——扩展AbpSession
源码路径:Github-LearningMpaAbp 一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Session是定义在Controller中的类型为HttpSessionStateBase的属性。 public HttpSessionStateBase Session { get; set; } 再来看看AbpSession是何须类也,咱们定位到AbpController中看一看。 public IAbpSession AbpSession { ge
圣杰
2018/01/11
1.7K0
ABP入门系列(10)——扩展AbpSession
在 ASP.NET Core 应用中使用 Cookie 进行身份认证
身份认证是网站最基本的功能,最近因为业务部门的一个需求,需要对一个已经存在很久的小工具网站进行改造,因为在逐步的将一些离散的系统迁移至 .NET Core,所以趁这个机会将这个老的 .NET Framework 4.0 的项目进行升级
程序员宇说
2021/02/04
1.4K0
在 ASP.NET Core 应用中使用 Cookie 进行身份认证
使用cookie来做身份认证
这里先讲一下Authentication和Authorization两个词的区别。
_淡定_
2018/08/28
3.6K0
.NET core3.1使用cookie进行身份认证
一个系统,用户身份认证少不了,ASP.NET Core提供完整的解决方案Identity,用户创建和维护登录名;也提供能cookie和JwtBearer认证方案,当然你可以使用第三方认证Oauth、openId。项目没有采用前后端分离,是一个标准的mvc项目,所以本文采用系统提供的cookie认证 记录一下简单认证流程,(1)使用用户账号密码进行登录,验证合法登录(2)确认合法身份之后,会颁发一个认证票据(加密)会携带与该用户相关的身份、权限以及其他信息。(3)退出。
李明成
2020/08/28
1.3K0
《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
云应用意味着应用运行所在的基础设施无法掌控,因此安全不能再等到事后再考虑,也不能只是检查清单上毫无意义的复选框
郑子铭
2021/01/13
1.9K0
《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
Asp.Net Core 中IdentityServer4 实战之 Claim详解
由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教;以后我会持续更新我的文章,望大家多多支持和关注。
Jlion
2022/04/07
1.4K0
Asp.Net Core 中IdentityServer4 实战之 Claim详解
【asp.net core 系列】13 Identity 身份验证入门
通过前两篇我们实现了如何在Service层如何访问数据,以及如何运用简单的加密算法对数据加密。这一篇我们将探索如何实现asp.net core的身份验证。
程序员小高
2020/06/24
1K0
ASP.NET Core 和 ASP.NET Framework 共享 Identity 身份验证
  .NET Core 已经热了好一阵子,1.1版本发布后其可用性也越来越高,开源、组件化、跨平台、性能优秀、社区活跃等等标签再加上“微软爸爸”主推和大力支持,尽管现阶段对比.net framework还是比较“稚嫩”,但可以想象到它光明的前景。作为 .net 开发者你是否已经开始尝试将项目迁移到 .net core 上?这其中要解决的一个较大的问题就是如何让你的 .net core 和老 .net framework 站点实现身份验证兼容! 1、第一篇章 我们先来看看 .net core 中对 id
捷义
2018/05/14
2.1K0
ASP.NET Core中使用Graylog记录日志
通常POST请求数据都在请求体中,ASP.NET Core中HttpRequest类型的Body属性是HttpRequestStream类型,该类型源码在Github上可以看到,但在Google和微软关方文档中都没搜索到。反编译Microsoft.AspNetCore.Server.Kestrel.Core.dll只找到了同样继承自ReadOnlyStream的FrameRequestStream
雪飞鸿
2019/02/25
1K0
.NET 云原生架构师训练营(权限系统 代码重构)--学习笔记
新增 AuthenticationController 用于登录和注册;登录会颁发 jwt token,包含用户的 claims 和 role 的 claims
郑子铭
2022/02/21
3430
.NET 云原生架构师训练营(权限系统 代码重构)--学习笔记
推荐阅读
相关推荐
吐槽一下Abp的用户和租户管理模块
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档