在Asp.Net Core 2.0中无法从HTTP请求头获取值的问题
从SiteMinder请求头获取用户信息并在导航栏展示的MVC实现
我明白你要做的事儿了,咱们把这个从SiteMinder请求头拿用户信息、还要在导航栏展示的控制器给补全弄好,下面是靠谱的实现方式:
首先得明确:SiteMinder在用户登录跳转回来后,会在HTTP请求头里塞自定义的用户字段(比如SM_USER、SM_USERFULLNAME、SM_USEREMAIL这些,具体字段名得跟你们的SiteMinder管理员确认),咱们直接通过HttpContext.Request.Headers就能读取到这些值。
完整的控制器代码
using Microsoft.AspNetCore.Mvc; using System.Text.Json; public class HomeController : Controller { [HttpGet] public async Task<IActionResult> GetUser() { // 从请求头读取SiteMinder返回的用户信息,字段名根据实际配置调整 var userName = HttpContext.Request.Headers["SM_USER"].FirstOrDefault(); var fullName = HttpContext.Request.Headers["SM_USERFULLNAME"].FirstOrDefault(); var email = HttpContext.Request.Headers["SM_USEREMAIL"].FirstOrDefault(); // 把用户信息封装成模型,方便后续传递和使用 var person = new UserInfo { UserName = userName, FullName = fullName, Email = email }; // 把用户信息存入ViewData,这样布局页(导航栏所在的页面)也能直接获取 if (!string.IsNullOrEmpty(person.UserName)) { ViewData["CurrentUser"] = person; // 也可以存入Session,实现跨页面的用户信息持久化 HttpContext.Session.SetString("CurrentUserName", person.UserName); } // 如果是返回视图就用return View(person),如果是AJAX请求返回JSON就用return Json(person) return View(person); } // 定义用户信息模型类 public class UserInfo { public string UserName { get; set; } public string FullName { get; set; } public string Email { get; set; } } }
在导航栏展示用户信息
一般导航栏都在全局布局页(比如_Layout.cshtml)里,咱们直接从ViewData里取用户信息就行:
<!-- _Layout.cshtml 导航栏代码片段 --> <nav class="navbar navbar-expand-lg navbar-dark bg-primary"> <div class="container"> <a class="navbar-brand" asp-controller="Home" asp-action="Index">我的应用</a> <div class="navbar-nav ms-auto"> @{ var currentUser = ViewData["CurrentUser"] as HomeController.UserInfo; } @if (currentUser != null) { <span class="nav-link text-white">欢迎您,@currentUser.FullName</span> <a class="nav-link text-white" asp-controller="Account" asp-action="Logout">退出登录</a> } else { <a class="nav-link text-white" asp-controller="Account" asp-action="Login">登录</a> } </div> </div> </nav>
几个关键注意点
- 确认请求头字段名:不同的SiteMinder配置可能用不同的字段名,比如有的用
REMOTE_USER代替SM_USER,一定要找管理员确认准确的字段。 - 处理编码/加密情况:如果SiteMinder返回的用户信息是Base64编码或者加密的,记得先做解码/解密处理再使用。
- 安全校验:可以加个中间件,统一检查请求头里的SiteMinder字段是否存在,防止未授权的请求绕过登录直接进入应用。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

