Azure Аутентификация AD и пользовательская авторизация на основе ролей в Angular 7 и. Net Core Web api - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел бы использовать Azure AD для аутентификации и хочу использовать пользовательскую авторизацию на основе ролей в angular 7 и. Net Core Web api. Мне удалось успешно аутентифицировать пользователя, используя Azure AD с msal, однако для авторизации я должен использовать роли, определенные в базе данных. Мне также нужно передать роль в токене обратно в приложение angular, чтобы я мог использовать роль и на стороне angular.

1 Ответ

1 голос
/ 10 февраля 2020

В Azure AD вы можете использовать добавление ролей приложения в своем приложении, а затем назначать пользователей и группы ролям, чтобы после входа в систему роли cliam существовали в токенах:

https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps

Другой подход заключается в использовании Azure групп AD и групповых утверждений:

https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-fed-group-claims

Но если ваш Информация о ролях хранится в локальной базе данных, после входа пользователя с помощью AAD с MSAL в приложении angular вы можете запрашивать базу данных и получать роли пользователя по идентификатору пользователя, при выполнении вызовов API вы можете отправлять роли в теле запроса.

Если вы не хотите запрашивать роли в клиентском приложении, при отправке токена доступа в. net core web api, вы можете запросить базу данных, чтобы получить роли пользователя в OnTokenValidated событии AddJwtBearer:

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);
                }
            }
        };
    });

Ссылка: https://joonasw.net/view/adding-custom-claims-aspnet-core-2

После этого вы можете передать роли обратно клиенту в теле запроса, но не можете изменить Azure AD токен для включения информации о ролях.

Если вы работаете совместно Чтобы узнать о безопасности передачи ролей в теле запроса, вы также можете использовать Identity Server 4 и добавить Azure AD в качестве внешнего провайдера входа в систему:

http://docs.identityserver.io/en/latest/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...