Angular 7和.Net核心Web api中的Azure AD身份验证和自定义角色库授权
我想使用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发送访问令牌时,可以查询数据库以获取用户在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广告组和组
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添加为外部登录提供程序: