Asp.net mvc 5 使用Windows身份验证在OWIN管道期间添加声明

Asp.net mvc 5 使用Windows身份验证在OWIN管道期间添加声明,asp.net-mvc-5,windows-authentication,owin,Asp.net Mvc 5,Windows Authentication,Owin,我试图探索如何在OWIN管道中向用户添加额外的声明。 我知道我可以在登录阶段或其他一些点上这样做,可能是在Global.asax中的Application\u PostAuthenticate部分,因为我没有login部分(这是一个Windows身份验证应用程序),但我想知道在OWIN管道中这样做是否可能,甚至更好 我的想法来自这样一个事实:OWIN也有一个后验证阶段。所以我试了一下: app.Use((context, next) => { var user = context.

我试图探索如何在OWIN管道中向用户添加额外的声明。 我知道我可以在登录阶段或其他一些点上这样做,可能是在
Global.asax中的
Application\u PostAuthenticate
部分,因为我没有
login
部分(这是一个Windows身份验证应用程序),但我想知道在OWIN管道中这样做是否可能,甚至更好

我的想法来自这样一个事实:OWIN也有一个
后验证阶段。所以我试了一下:

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>
    @foreach(ClaimsPrincipal.Current.Claims中的var索赔) {
  • @claim.Type-@claim.Value
  • }
但我新增的声明没有出现。有什么想法吗


我知道无论如何都需要在应用程序级别添加“某些”声明(角色来自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();
});
app.Use((上下文,函数)=>{
var claimsIdentity=context.Authentication.User.Identity作为claimsIdentity;
if(claimsIdentity!=null){
var claimsToAdd=新列表();
//检查是否有任何groupsid声明,将其添加为角色声明
foreach(索赔实体中的var索赔){
if(claim.Type==ClaimTypes.GroupSid){
claimsToAdd.Add(新索赔(ClaimTypes.Role,
新的SecurityIdentifier(claim.Value)
.Translate(typeof(NTAccount)).ToString());
}
}
如果(claimsToAdd.Count>0){
索赔实体。添加索赔(索赔添加);
}
}
返回func.Invoke();
});
这在我使用Microsoft.Owin v3.0.0.0时非常有效