【发布时间】:2018-02-21 22:02:31
【问题描述】:
场景是带有 c# WebApi 的 Angularjs 1.6.5 应用程序。使用angular-adal.js 对AAD 进行身份验证。到目前为止,一切正常,因为用户可以通过 AAD 登录并且 WebApi 接受令牌。
对于此特定应用,角色位于 WebApi 有权访问的外部应用中。我已经能够使用WindowsAzureActiveDirectoryBearerAuthenticationOptions 和ConfigureOAuth(IAppBuilder app) 中的以下代码添加角色声明(从外部应用程序获取它们之后):
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
ValidAudience = clientId
},
//Audience = ConfigurationManager.AppSettings["ida:ClientID"],
Tenant = tenant,
Provider = new OAuthBearerAuthenticationProvider
{
OnValidateIdentity = async context =>
{
// Retrieve user JWT token from request.
var authorizationHeader = context.Request.Headers["Authorization"];
var userJwtToken = authorizationHeader.Substring("Bearer ".Length).Trim();
// Get current user identity from authentication ticket.
var authenticationTicket = context.Ticket;
var identity = authenticationTicket.Identity;
if (identity.FindFirst(System.Security.Claims.ClaimTypes.Role) == null)
{
var user = identity.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn").Value;
Cis.bll.Xrm.bllSystemUserRoles bllSystemUserRoles = new Cis.bll.Xrm.bllSystemUserRoles();
var su = bllSystemUserRoles.getByEmail(user);
//var roleClaim = new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, su.stringRoles);
foreach (var item in su.Roles)
{
identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, item.xrmName));
}
}
}
}
});
因此,对于 Angularjs 对 API 执行的每个 httpRequest,前面的函数都会为用户查找角色并添加角色声明。通过这个实现,我可以在 Controller 方法中使用 AuthorizeAttribute,将访问权限限制为仅限某些角色,如下所示:
[CustomAuthorize(Constants.Roles.resourcesAdministrator)]
我发现这种方式非常低效,因为对于每个 httpRequest,API 都必须从数据库中获取用户的角色(或实现的任何持久化方式)。
我想要做的是只读取一次用户角色,然后能够在 API 中使用它们来处理每个后续请求。在我们收到 AAD 的令牌后,有没有办法将声明添加到令牌中?
顺便说一句,我可以为每个模型添加一个 Roles 属性,或者类似的东西,但这不是我想要的。
如果您有任何其他想法或建议,我们将不胜感激。
问候
【问题讨论】:
-
angular标签适用于2+angularjs标签适用于1.x -
感谢@Kuncevic 的更新。当我们使用 Angular 1.x 时,我会记住这一点。
标签: angularjs token claims adal.js