c# - 使用 Windows 身份验证时如何保留自定义声明
问题描述
我正在尝试在使用 Windows 身份验证时向我的 MVC 应用程序添加声明,但声明在请求之间不会持续存在。
关于如何做到这一点的任何建议?我在 global.asax 的 Application_AuthorizeRequest 中添加声明并读取我的控制器中的值。
全球.asax:
protected void Application_AuthorizeRequest()
{
var claimsPrincipal = User as ClaimsPrincipal;
var claimsIdentity = User.Identity as ClaimsIdentity;
if (!claimsPrincipal.Claims.Where(x => x.Type == "IsSpecial").Any()) \\ALWAYS TRUE!
{
var domain = User.Identity.Name.Split('\\')[0];
using (var ctx = new PrincipalContext(ContextType.Domain, domain))
using (var user = UserPrincipal.FindByIdentity(ctx, HttpContext.Current.User.Identity.Name))
{
if (user != null)
{
var groups = user.GetGroups()
.Select(x => x.SamAccountName);
if (groups.Contains("Special User")
{
claimsIdentity.AddClaim(new Claim("IsSpecial", "Yes"));
}
控制器:
var claimsPrincipal = User as ClaimsPrincipal;
var isSpecial = claimsPrincipal.Claims.Where(x => x.Type == "IsSpecial").First().Value;
解决方案
这就是它的工作方式。用户的身份总是为每个请求重新创建,尽管确切的方法因身份验证方法而异。
启用 Windows 身份验证基本上只是意味着在浏览器发送票证/用户名/密码时自动为您设置用户名。
无论您使用 cookie、不记名令牌还是 Windows 身份验证,以及是否将声明存储在 AD、数据库或令牌中,您仍然需要在每个请求的某个时间点添加声明
推荐阅读
- python - 如何检查第三个列表中是否存在两个列表的元素组合?
- spring-boot - 使用 spock 进行集成测试。在第一次测试之前加载上下文
- html - 更宽的元素作为孩子(css)
- sql-server - 选择语句嵌套查询
- sql - 替换 sqlite3 中的字符
- javascript - 未显示离子管道值
- php - php登录页面 - 当我插入有效数据时它不起作用,但是当我插入无效数据时它工作得很好
- javascript - 使用 npm prod 与 devq 进行编译
- c++ - 有没有办法避免以下代码中的内存泄漏?
- html - 网格布局 Internet Explorer 无法正常工作