MVC: добавление и редактирование имени роли утверждения удостоверения при использовании проверки подлинности AAD - PullRequest
1 голос
/ 13 июня 2019

Я использую AAD для входа в систему и аутентификации пользователя, к сожалению, нет никаких основанных на ролях, которые я могу использовать из AAD, поэтому мне нужно полагаться на роли, установленные в БД, однако я не знаю как добавить роль для этого пользователя, основываясь на том, что находится в БД, не затрагивая куки-файлы аутентификации?

Мне, однако, удалось добавить роль внутри моего Startup.Auth в app.UseOpenIdConnectAuthentication, например

Notifications = new OpenIdConnectAuthenticationNotifications
           {
             AuthenticationFailed = (context) =>
             {
                context.HandleResponse();
                context.OwinContext.Response.Redirect("/Account/Login");
                return Task.FromResult(0);
             },
             SecurityTokenValidated = async (x) =>
             {
                var identity = x.AuthenticationTicket.Identity;
                //check the name, add additional claims 
                identity.AddClaim(new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "Administrator"));

                await Task.FromResult(0);
              }
            }

Однако, поскольку я добавляю Administrator вручную, я не знаю, как это изменить в зависимости от роли, связанной с пользователем в БД. Я думал, что, возможно, смогу обновить роль, как только она попадет на мой контроллер (который является моим домом / индексом), но изо всех сил пытался найти что-то, что работает.

Я хочу использовать User.IsInRole("UserRoleNameHere").

Любая помощь или идеи будут с благодарностью!

1 Ответ

0 голосов
/ 18 июня 2019

Мне удалось найти решение! В конечном итоге я добавил новое утверждение в ClaimsIdentity, вышел из системы, чтобы очистить сохраненный предыдущий идентификатор, а затем снова выполнил вход, чтобы добавить новый идентификатор с новым добавленным утверждением:

            var result = (from U in db.Users
                          from R in U.Roles
                          join R2 in db.Roles on R.RoleId equals R2.Id
                          where U.Id == loggedInUserId
                          select new { R2.Name, U.UserName }).FirstOrDefault();

            ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
            identity.AddClaim(new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", result.Name));

            IOwinContext context = new OwinContext();

            context.Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            context.Authentication.SignIn(identity);

            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

            if (User.IsInRole("Administrator"))
            {
                isAdmin = true;
            }
...