Szenario ist Angularjs 1.6.5 App mit einem C# WebApi. Die Authentifizierung erfolgt gegen AAD
unter Verwendung von angular-adal.js
. Bis jetzt funktioniert alles perfekt, da sich Benutzer über AAD anmelden können und WebApi das Token akzeptiert.Angularjs Adal und weitere Ansprüche oder Eigenschaften für die Autorisierung
Für diese spezifische Anwendung befinden sich die Rollen in einer externen Anwendung, auf die der WebApi zugreifen kann. Ich habe in der Lage, die Rolle Ansprüche hinzuzufügen (nach sie aus der externen App holen) mit der Verwendung von WindowsAzureActiveDirectoryBearerAuthenticationOptions
mit dem folgenden Code innerhalb der 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));
}
}
}
}
});
Also für jeden httprequest dass AngularJS tut, um die API, die Die vorherige Funktion sucht die Rollen für den Benutzer und fügt die Rollenansprüche hinzu. Mit dieser Implementierung, kann ich eine AuthorizeAttribute in den Controller-Methoden verwenden, die Beschränkung des Zugriffs auf bestimmte Rollen wie so:
[CustomAuthorize(Constants.Roles.resourcesAdministrator)]
Ich finde diese Art und Weise sehr inneficient, denn mit jeder httprequest, hat die API die holen Rollen des Benutzers aus der Datenbank (oder welcher Persistenzweg auch immer implementiert ist).
Was ich tun möchte, ist die Benutzerrollen nur einmal zu lesen, und dann in der Lage sein, sie bei jeder nachfolgenden Anfrage in der API zu verwenden. Gibt es eine Möglichkeit, die Ansprüche dem Token hinzuzufügen, nachdem wir das Token für AAD erhalten haben?
BTW, ich könnte nur hinzufügen, eine Rolle-Eigenschaft zu jedem Modell oder so etwas, aber es ist nicht das, was ich suche.
Wenn Sie andere Ideen oder Vorschläge haben, werden sie sehr geschätzt.
Grüße
'angular'-Tag ist für' 2 + '' angularjs'-Tag ist für '1.x' – Kuncevic
Dank für das Update @Kuncevic. Ich werde das im Hinterkopf behalten, da wir Angular 1.x verwenden. – aplon