使用Windows身份验证在OWIN管道期间添加声明



我正在尝试探索如何在OWIN管道期间向用户添加额外声明。我知道我可以在登录阶段或其他一些时候这样做,可能是在Global.asaxApplication_PostAuthenticate部分,因为我没有Login部分(它是一个Windows身份验证应用程序),但我想知道在OWIN管道中这样做是否可能,甚至更好。

我的想法来自于这样一个事实,即OWIN也有一个PostAuthenticate阶段在酝酿中。所以我尝试了这个:

app.Use((context, next) =>
{
    var user = context.Authentication.User.Identity as ClaimsIdentity;
    if (user != null)
    {
        user.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
        user.AddClaim(new Claim(ClaimTypes.GivenName, "Mr. Tallmaris"));
    }
    return next.Invoke();
});

通过一个断点,我可以看到用户是正确的,并且添加了声明,但在我看来,我有这样的东西:

<ul>
    @foreach (var claim in ClaimsPrincipal.Current.Claims)
    {
        <li>@claim.Type - @claim.Value</li>
    }
</ul>

但我新增加的索赔没有出现。有什么想法吗?

我知道无论如何都需要在应用程序级别添加"一些"声明(角色来自DB和其他东西),但我想探索直接从OWIN管道添加某些声明。

我在asp.net应用程序中将这个原则用于将groupsid声明转换为角色声明。

app.Use((context, func) => {
  var claimsIdentity = context.Authentication.User.Identity as ClaimsIdentity;
  if (claimsIdentity != null) {
    var claimsToAdd = new List<Claim>();
    //check if we have any groupsid claims, add these as role claims
    foreach (var claim in claimsIdentity.Claims) {
      if (claim.Type == ClaimTypes.GroupSid) {
        claimsToAdd.Add(new Claim(ClaimTypes.Role,
          new SecurityIdentifier(claim.Value)
            .Translate(typeof(NTAccount)).ToString()));
      }
    }
    if (claimsToAdd.Count > 0) {
      claimsIdentity.AddClaims(claimsToAdd);
    }
  }
  return func.Invoke();
});

这对我使用Microsoft.Owin v3.0.0.0 起到了作用

最新更新