【问题标题】:How to persist custom claim when using windows authentication使用 Windows 身份验证时如何保留自定义声明
【发布时间】:2018-10-16 08:31:51
【问题描述】:

我正在尝试在使用 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;

【问题讨论】:

  • “在请求之间不持久”是指每次请求都会调用您的代码吗?
  • 是的,在每个新请求上都没有名为“IsSpecial”的声明

标签: c# asp.net-mvc authentication


【解决方案1】:

这就是它的工作方式。用户的身份总是为每个请求重新创建,但具体方法因身份验证方法而异。

启用 Windows 身份验证基本上只是意味着在浏览器发送票证/用户名/密码时自动为您设置用户名。

无论您使用 cookie、承载令牌还是 Windows 身份验证,以及您是否将声明存储在 AD、数据库或令牌中,您仍然需要在某个时间点添加声明每个请求

【讨论】:

  • so.. 我们如何添加自定义声明?
  • @Enrico - 根据 OP。查看ClaimsPrincipalClaimsIdentity 类和文档了解详细信息
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多