将应用程序角色作为自定义声明添加到Azure AD身份

时间:2018-08-21 16:06:17

标签: asp.net asp.net-mvc azure-active-directory openid-connect asp.net-identity-3

我有一个webapp,它同时支持基于表单的身份验证(使用OOTB Asp.net身份框架)和基于Azure AD的身份验证(使用OpenID Connect)。身份验证对于基于表单的用户和Azure AD用户都适用。现在,角色位于数据库中(使用OOTB Asp.net身份框架),并且将角色作为对所有asp.net身份用户的声明获得。但是对于Azure AD身份用户,我无法获得角色声明。我尝试通过电子邮件查询数据库并获取Azure AD用户的角色,然后将其设置为角色声明,如下所示:

User.SetClaims(ClaimTypes.Role,roleAdministrator.Name);//calling the set method

按如下所述设置声明。

 public static void SetClaims(this IPrincipal user,string claimType,string claimValue)
        {
            if (user?.Identity is ClaimsIdentity claimsIdentity)
            {
                var name = claimsIdentity.FindFirst(claimType);
                if (name != null)
                    claimsIdentity.RemoveClaim(name);
                claimsIdentity.AddClaim(new Claim(claimType, claimValue));
            }
        }

这仅适用于特定的http请求,并且当我单击其他位置或刷新页面时,角色声明不再出现在Azure AD身份中。

如何使用以asp.net身份角色(而不是作为Azure AD角色)管理的角色来实现Azure AD身份验证

请注意,目前我不可以使用Azure AD角色,因为这是具有asp.net身份和角色的现有应用程序。我正在尝试以最少的更改添加一个身份验证提供程序。因此角色必须像现在一样保存在数据库中。

1 个答案:

答案 0 :(得分:0)

如果要为Azure AD用户添加自定义属性,则可以使用Directory schema extensions,该属性可用于向目录对象添加属性,而无需外部数据存储。您可以遵循此tutorial来注册扩展名,写入和读取扩展名值。

如果可以使用Azure AD B2C,则可以define custom attributes in Azure Active Directory B2C

关于如何获取自定义属性,请参阅another SO thread