Angular 7和.Net核心Web api中的Azure AD身份验证和自定义角色库授权

Angular 7和.Net核心Web api中的Azure AD身份验证和自定义角色库授权,angular,authentication,azure-active-directory,authorization,asp.net-core-webapi,Angular,Authentication,Azure Active Directory,Authorization,Asp.net Core Webapi,我想使用Azure AD进行身份验证,并希望在angular 7和.Net Core Web api中使用自定义的基于角色的授权。我能够使用带有msal的Azure AD成功地验证用户,但是为了进行授权,我必须使用数据库中定义的角色。我还需要将令牌中的角色传递回angular应用程序,以便我也可以使用angular端的角色。在Azure AD中,您可以在应用程序中使用添加应用程序角色,然后将用户和组分配给角色,以便用户登录后,角色cliam将存在于令牌中: 另一种方法是使用Azure广告组和组

我想使用Azure AD进行身份验证,并希望在angular 7和.Net Core Web api中使用自定义的基于角色的授权。我能够使用带有msal的Azure AD成功地验证用户,但是为了进行授权,我必须使用数据库中定义的角色。我还需要将令牌中的角色传递回angular应用程序,以便我也可以使用angular端的角色。

在Azure AD中,您可以在应用程序中使用添加应用程序角色,然后将用户和组分配给角色,以便用户登录后,角色cliam将存在于令牌中:

另一种方法是使用Azure广告组和组声明:

但若您的角色信息保存在本地数据库中,则在angular应用程序中用户使用带有MSAL的AAD登录后,您可以通过用户id查询数据库并获取用户的角色,在执行api调用时,您可以在请求体中发送角色

如果您不想查询客户端应用程序中的角色,则在向.net core web api发送访问令牌时,可以查询数据库以获取用户在
AddJWTBear
事件中的角色:

services
    .AddAuthentication(o =>
    {
        o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(o =>
    {
        //Additional config snipped
        o.Events = new JwtBearerEvents
        {
            OnTokenValidated = async ctx =>
            {
                //Get the calling app client id that came from the token produced by Azure AD
                string clientId = ctx.Principal.FindFirstValue("appid");

                //Get EF context
                var db = ctx.HttpContext.RequestServices.GetRequiredService<AuthorizationDbContext>();

                //Check if this app can read confidential items
                bool canReadConfidentialItems = await db.Applications.AnyAsync(a => a.ClientId == clientId && a.ReadConfidentialItems);
                if (canReadConfidentialItems)
                {
                    //Add claim if yes
                    var claims = new List<Claim>
                    {
                        new Claim("ConfidentialAccess", "true")
                    };
                    var appIdentity = new ClaimsIdentity(claims);

                    ctx.Principal.AddIdentity(appIdentity);
                }
            }
        };
    });
服务
.AddAuthentication(o=>
{
o、 DefaultScheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o=>
{
//附加配置被截断
o、 事件=新JWTBeareEvents
{
OnTokenValidated=异步ctx=>
{
//获取来自Azure AD生成的令牌的调用应用程序客户端id
字符串clientId=ctx.Principal.FindFirstValue(“appid”);
//获取EF上下文
var db=ctx.HttpContext.RequestServices.GetRequiredService

之后,您可以在请求正文中将角色传递回客户端,但不能修改Azure AD令牌以包含角色信息

如果您担心在请求正文中传递角色的安全性,还可以使用Identity Server 4并将Azure AD添加为外部登录提供程序:


在Azure AD中,您可以在应用程序中使用添加应用程序角色,然后将用户和组分配给角色,以便用户登录后,角色cliam将存在于令牌中:

另一种方法是使用Azure广告组和组声明:

但若您的角色信息保存在本地数据库中,则在angular应用程序中用户使用带有MSAL的AAD登录后,您可以通过用户id查询数据库并获取用户的角色,在执行api调用时,您可以在请求体中发送角色

如果您不想查询客户端应用程序中的角色,则在向.net core web api发送访问令牌时,可以查询数据库以获取用户在
AddJWTBear
事件中的角色:

services
    .AddAuthentication(o =>
    {
        o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(o =>
    {
        //Additional config snipped
        o.Events = new JwtBearerEvents
        {
            OnTokenValidated = async ctx =>
            {
                //Get the calling app client id that came from the token produced by Azure AD
                string clientId = ctx.Principal.FindFirstValue("appid");

                //Get EF context
                var db = ctx.HttpContext.RequestServices.GetRequiredService<AuthorizationDbContext>();

                //Check if this app can read confidential items
                bool canReadConfidentialItems = await db.Applications.AnyAsync(a => a.ClientId == clientId && a.ReadConfidentialItems);
                if (canReadConfidentialItems)
                {
                    //Add claim if yes
                    var claims = new List<Claim>
                    {
                        new Claim("ConfidentialAccess", "true")
                    };
                    var appIdentity = new ClaimsIdentity(claims);

                    ctx.Principal.AddIdentity(appIdentity);
                }
            }
        };
    });
服务
.AddAuthentication(o=>
{
o、 DefaultScheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o=>
{
//附加配置被截断
o、 事件=新JWTBeareEvents
{
OnTokenValidated=异步ctx=>
{
//获取来自Azure AD生成的令牌的调用应用程序客户端id
字符串clientId=ctx.Principal.FindFirstValue(“appid”);
//获取EF上下文
var db=ctx.HttpContext.RequestServices.GetRequiredService

之后,您可以在请求正文中将角色传递回客户端,但不能修改Azure AD令牌以包含角色信息

如果您担心在请求正文中传递角色的安全性,还可以使用Identity Server 4并将Azure AD添加为外部登录提供程序: