我对网站上的 Windows 身份验证以及如何管理内置管理员的声明感到困惑。具有管理员权限但未通过IsInRole(BuiltInAdmin)
测试的用户。
- 为什么分配拒绝声明?
- 我应该直接检查用户而不是依赖提供的声明吗?
- 这是在网站上使用 Windows 身份验证的非提升身份声明的结果吗?
在我为某些情况添加 IS 管理员检查之前,该过程一切正常。我使用了按预期触发的自定义 AUTH 属性按预期 工作并记录了 AuthorizeAttribute 我可以返回真或假。所以这一切都很好。
但检查 ADMIN 角色失败。
编码:
[AttributeUsage(AttributeTargets.Class)] // all controllers inherit this attribuet
public class CUSTOMAuth:AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext) {
if (! base.AuthorizeCore(httpContext)) {
return false;
}
// is the identity on teh request an admin ?
return (IsLocalAdmin(httpContext.Request.LogonUserIdentity));
}
}
public static bool IsLocalAdmin(WindowsIdentity identity) {
var localAdmins = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
if (identity != null) {
var prin = new WindowsPrincipal(identity);
return (prin.IsInRole(localAdmins)); //<<< returns false
}
return false;
}
在调试器中,我看到 httpContext.Request.LogonUserIdentity 与 CLAIMS/denyonlysid 一起交付:
所以这意味着请求说除了内置的管理员声明。尽管用户确实具有管理员权限。
额外信息: APP POOL 使用集成模式。Windows 身份验证,并具有特殊的用户身份。自定义用户没有管理员权限。