我正在尝试探索如何在OWIN管道期间向用户添加额外声明。我知道我可以在登录阶段或其他一些时候这样做,可能是在Global.asax
的Application_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 起到了作用