如何查看ASP.NET Core 2.0 MVC中用户登录传入令牌及当前身份已保存令牌?
调试OpenIdConnect令牌的两种方法(ASP.NET Core 2.0 MVC)
咱直接针对你的需求来,分两个场景给你实现方案,完全适配你现有的Startup配置:
一、查看登录时传入的令牌(从授权服务器返回时捕获)
你可以在OpenIdConnect的配置里添加TokenReceived事件,这个事件会在令牌从你的授权服务器(http://localhost:5000)返回后触发,刚好适合抓取原始令牌和解析内部内容。
修改你Startup.cs里的AddOpenIdConnect配置:
.AddOpenIdConnect("oidc", options => { options.SignInScheme = "Cookies"; options.GetClaimsFromUserInfoEndpoint = true; options.Authority = "http://localhost:5000"; // 保留你原来的其他配置... // 新增事件处理来捕获令牌 options.Events = new OpenIdConnectEvents { OnTokenReceived = context => { // 直接拿到原始令牌 var idToken = context.TokenEndpointResponse.IdToken; var accessToken = context.TokenEndpointResponse.AccessToken; var refreshToken = context.TokenEndpointResponse.RefreshToken; // 调试用:输出到控制台(或者写入日志) Console.WriteLine($"=== 收到的令牌 ==="); Console.WriteLine($"Id Token: {idToken}"); Console.WriteLine($"Access Token: {accessToken}"); Console.WriteLine($"Refresh Token: {refreshToken}"); // 要是想解析令牌里的声明内容,用JwtSecurityTokenHandler var jwtHandler = new JwtSecurityTokenHandler(); if (jwtHandler.CanReadToken(idToken)) { var decodedIdToken = jwtHandler.ReadJwtToken(idToken); Console.WriteLine($"=== Id Token 解析后的声明 ==="); foreach (var claim in decodedIdToken.Claims) { Console.WriteLine($"{claim.Type}: {claim.Value}"); } } return Task.CompletedTask; } }; });
启动项目后,用户登录时你就能在控制台看到所有令牌的原始内容和解析后的声明了。
二、列出当前已登录用户的所有保存令牌
因为你用Cookies作为登录Scheme,令牌会被加密存储在Cookie的AuthenticationProperties里。你可以在任意Controller的Action里提取这些令牌:
比如新建一个调试用的Action:
public async Task<IActionResult> ListSavedTokens() { // 获取当前用户的认证信息 var authResult = await HttpContext.AuthenticateAsync("Cookies"); var authProperties = authResult.Properties; // 提取各种令牌(ASP.NET Core用.Token.前缀存储这些令牌) var tokens = new Dictionary<string, string>(); if (authProperties.Items.TryGetValue(".Token.id_token", out var idToken)) tokens["Id Token"] = idToken; if (authProperties.Items.TryGetValue(".Token.access_token", out var accessToken)) tokens["Access Token"] = accessToken; if (authProperties.Items.TryGetValue(".Token.refresh_token", out var refreshToken)) tokens["Refresh Token"] = refreshToken; // 也可以拿到所有和令牌相关的存储项 var allTokenItems = authProperties.Items.Where(kv => kv.Key.StartsWith(".Token.")); // 把数据传给View展示 ViewBag.Tokens = tokens; ViewBag.AllTokenItems = allTokenItems; return View(); }
然后对应的View(ListSavedTokens.cshtml)可以这样写来展示:
<h2>当前用户保存的令牌</h2> @foreach (var token in ViewBag.Tokens) { <div class="token-item"> <h4>@token.Key</h4> <pre>@token.Value</pre> </div> } <h3>所有令牌相关存储项</h3> <ul> @foreach (var item in ViewBag.AllTokenItems) { <li><strong>@item.Key</strong>: @item.Value</li> } </ul>
访问这个Action就能看到当前登录用户所有已保存的令牌了。
注意事项
- 这些代码都是调试专用,上线前一定要移除或者注释掉,避免敏感令牌信息泄露;
- 如果你的授权服务器返回了其他类型的令牌,也可以通过
.Token.前缀的键去查找对应的存储项。
内容的提问来源于stack exchange,提问作者André Snede
相关产品推荐
相关产品推荐

