Авторизация с помощью контроллеров с группами объявлений с использованием OIDC

#asp.net-mvc #azure-active-directory #openid-connect

#asp.net-mvc #azure-active-directory #OpenID-подключение

Вопрос:

у нас есть веб-приложение, которое использует OIDC для единого входа для аутентификации в Azure AD. Единый вход работает отлично, пользователи могут входить в систему со своих учетных записей AD. Возвращаемый токен также содержит группы AD. Я хотел бы разрешить моим контроллерам MVC разрешать только определенным группам использовать определенные контроллеры.

Как мне это реализовать? Я вижу, что группы отправляются обратно в токене, представленном в виде идентификаторов GUID. Я пробовал устанавливать требования к роли через RoleClaimType = "roles", , но это не работает.

вот мой код.

   public void ConfigureAuth(IAppBuilder app)
    {
        FATContext db = new FATContext();

        

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            CookieManager = new Microsoft.Owin.Host.SystemWeb.SystemWebChunkingCookieManager(),
        });

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = Authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = false,
                    // Set claimsPrincipal's roles to the roles claim
                    RoleClaimType = "roles",
                },
               
                Notifications = new OpenIdConnectAuthenticationNotifications()
                {

                    RedirectToIdentityProvider = (context) =>
                    {
                       
                        context.ProtocolMessage.RedirectUri = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path);
                        context.ProtocolMessage.PostLogoutRedirectUri = new UrlHelper(HttpContext.Current.Request.RequestContext).Action("Index", "Home", null, HttpContext.Current.Request.Url.Scheme);

                        return Task.FromResult(0);
                    },
                    // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
                    AuthorizationCodeReceived = (context) =>
                    {
                        
                        var code = context.Code;
                        ClientCredential credential = new ClientCredential(clientId, appKey);
                        string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
                        AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID));
                        return authContext.AcquireTokenByAuthorizationCodeAsync(
                           code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);
                    }
                }
            });
      


    }
 

Так, например, как я могу заставить это работать с моим контроллером, например

  [AuthorizeUser(Roles = "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
    public ActionResult Index()
    {
        return View();
    }
 

или проверить, находится ли пользователь в определенной роли, т.е. User.IsInRole("example ")

Ответ №1:

В Azure AD мы можем определять роли приложений и назначать роли группам. Теперь у пользователей этой группы будет заявка с определенными ролями (пример, как показано ниже). Обратитесь к этой ссылке для получения подробной документации о том, как создавать / управлять ролями для приложения в Azure AD.

 {
  "roles": ["admin"]
}
 

Если вы просто пытаетесь использовать авторизацию на основе групп, вы можете использовать RoleClaimType = «groups» и приведенные ниже примеры кодов в контроллере или в методах действий. Для получения более подробной информации у вас есть аналогичная информация здесь

 [Authorize(Roles = "Admin")]
public class TestAdminAccessController : ApiController
{
    public ActionResult Index()
    {
        if (this.User.Identity.IsAuthenticated)
        {
            if (User.IsInRole("Admin"))
            {
                // Your logic
            }
            else
            {
                // is NOT an admin. No permissions
            }
        }
        else
        {
            // is NOT Authenticated;    
        }
    }
}