Exercício – Garantir o acesso seguro com a lista de controlo de acesso

Concluído

Neste exercício, vai atualizar o código responsável pela importação de ficheiros markdowns locais com a configuração de ACLs em itens selecionados.

Antes de começar

Antes de realizar este exercício, certifique-se de que conclui o exercício anterior neste módulo.

Importar conteúdo disponível para todas as pessoas na organização

Quando implementou o código para importar conteúdo externo no exercício anterior, configurou-o para estar disponível para todas as pessoas na organização. Eis o código que utilizou:

static IEnumerable<ExternalItem> Transform(IEnumerable<DocsArticle> content)
{
  var baseUrl = new Uri("https://learn.microsoft.com/graph/");

  return content.Select(a =>
  {
    var docId = GetDocId(a.RelativePath ?? "");

    return new ExternalItem
    {
      Id = docId,
      Properties = new()
      {
        AdditionalData = new Dictionary<string, object> {
            { "title", a.Title ?? "" },
            { "description", a.Description ?? "" },
            { "url", new Uri(baseUrl, a.RelativePath!.Replace(".md", "")).ToString() }
        }
      },
      Content = new()
      {
        Value = a.Content ?? "",
        Type = ExternalItemContentType.Html
      },
      Acl = new()
      {
          new()
          {
            Type = AclType.Everyone,
            Value = "everyone",
            AccessType = AccessType.Grant
          }
      }
    };
  });
}

Configurou a ACL para conceder acesso a todas as pessoas. Vamos ajustá-lo para as páginas de markdown selecionadas que está a importar.

Importar conteúdo disponível para selecionar utilizadores

Em primeiro lugar, configure uma das páginas que está a importar para estar acessível apenas a um utilizador específico.

No browser:

  1. Navegue para o portal do Azure em https://portal.azure.com e inicie sessão com a sua conta escolar ou profissional.

  2. Na barra lateral, selecione Microsoft Entra ID.

  3. Na navegação, selecione Utilizadores.

  4. Na lista de utilizadores, abra um dos utilizadores ao selecionar o respetivo nome.

  5. Copie o valor da propriedade ID do Objeto .

    Captura de ecrã do portal do Azure com um perfil de utilizador aberto.

Utilize este valor para definir uma nova ACL para uma página de markdown específica.

No editor de código:

  1. Abra o ficheiro ContentService.cs e localize o Transform método .

  2. Dentro do Select delegado, defina a ACL predefinida que se aplica a todos os itens importados:

    var acl = new Acl
    {
      Type = AclType.Everyone,
      Value = "everyone",
      AccessType = AccessType.Grant
    };
    
  3. Em seguida, substitua a ACL predefinida para o ficheiro markdown com o nome a terminar em use-the-api.md:

    if (a.RelativePath!.EndsWith("use-the-api.md"))
    {
      acl = new()
      {
        Type = AclType.User,
        // AdeleV
        Value = "6de8ec04-6376-4939-ab47-83a2c85ab5f5",
        AccessType = AccessType.Grant
      };
    }
    
  4. Por fim, atualize o código que devolve o item externo para utilizar a ACL definida:

    return new ExternalItem
    {
      Id = docId,
      Properties = new()
      {
        AdditionalData = new Dictionary<string, object> {
          { "title", a.Title ?? "" },
          { "description", a.Description ?? "" },
          { "url", new Uri(baseUrl, a.RelativePath!.Replace(".md", "")).   ToString() }
        }
      },
      Content = new()
      {
        Value = a.Content ?? "",
        Type = ExternalItemContentType.Html
      },
      Acl = new()
      {
        acl
      }
    };
    
  5. O método atualizado Transform tem o seguinte aspeto:

    static IEnumerable<ExternalItem> Transform(IEnumerable<DocsArticle>    content)
    {
      var baseUrl = new Uri("https://learn.microsoft.com/graph/");
    
      return content.Select(a =>
      {
        var acl = new Acl
        {
          Type = AclType.Everyone,
          Value = "everyone",
          AccessType = AccessType.Grant
        };
    
        if (a.RelativePath!.EndsWith("use-the-api.md"))
        {
          acl = new()
          {
            Type = AclType.User,
            // AdeleV
            Value = "6de8ec04-6376-4939-ab47-83a2c85ab5f5",
            AccessType = AccessType.Grant
          };
        }
    
        var docId = GetDocId(a.RelativePath ?? "");
    
        return new ExternalItem
        {
          Id = docId,
          Properties = new()
          {
            AdditionalData = new Dictionary<string, object> {
              { "title", a.Title ?? "" },
              { "description", a.Description ?? "" },
              { "url", new Uri(baseUrl, a.RelativePath!.Replace(".md", "")).   ToString() }
            }
          },
          Content = new()
          {
            Value = a.Content ?? "",
            Type = ExternalItemContentType.Html
          },
          Acl = new()
          {
            acl
          }
        };
      });
    }
    
  6. Salve suas alterações.

Importar conteúdo disponível para um grupo selecionado

Agora, vamos expandir o código para que outra página só seja acessível por um grupo de utilizadores selecionado.

No browser:

  1. Navegue para o portal do Azure em https://portal.azure.com e inicie sessão com a sua conta escolar ou profissional.
  2. Na barra lateral, selecione Microsoft Entra ID.
  3. Na navegação, selecione Grupos.
  4. Na lista de grupos, abra um dos grupos ao selecionar o respetivo nome.
  5. Copie o valor da propriedade ID do Objeto .

Captura de ecrã do portal do Azure com uma página de grupo aberta.

Utilize este valor para definir uma nova ACL para uma página de markdown específica.

No editor de código:

  1. Abra o ficheiro ContentService.cs e localize o Transform método

  2. Expanda a cláusula definida if anteriormente, com uma condição adicional para definir a ACL para o ficheiro markdown com o nome a terminar em traverse-the-graph.md:

    if (a.RelativePath!.EndsWith("use-the-api.md"))
    {
      acl = new()
      {
        Type = AclType.User,
        // AdeleV
        Value = "6de8ec04-6376-4939-ab47-83a2c85ab5f5",
        AccessType = AccessType.Grant
      };
    }
    else if (a.RelativePath.EndsWith("traverse-the-graph.md"))
    {
      acl = new()
      {
        Type = AclType.Group,
        // Sales and marketing
        Value = "a9fd282f-4634-4cba-9dd4-631a2ee83cd3",
        AccessType = AccessType.Grant
      };
    }
    
  3. O método atualizado Transform tem o seguinte aspeto:

    static IEnumerable<ExternalItem> Transform(IEnumerable<DocsArticle>    content)
    {
      var baseUrl = new Uri("https://learn.microsoft.com/graph/");
    
      return content.Select(a =>
      {
        var acl = new Acl
        {
          Type = AclType.Everyone,
          Value = "everyone",
          AccessType = AccessType.Grant
        };
    
        if (a.RelativePath!.EndsWith("use-the-api.md"))
        {
          acl = new()
          {
            Type = AclType.User,
            // AdeleV
            Value = "6de8ec04-6376-4939-ab47-83a2c85ab5f5",
            AccessType = AccessType.Grant
          };
        }
        else if (a.RelativePath.EndsWith("traverse-the-graph.md"))
        {
          acl = new()
          {
            Type = AclType.Group,
            // Sales and marketing
            Value = "a9fd282f-4634-4cba-9dd4-631a2ee83cd3",
            AccessType = AccessType.Grant
          };
        }
    
        var docId = GetDocId(a.RelativePath ?? "");
    
        return new ExternalItem
        {
          Id = docId,
          Properties = new()
          {
            AdditionalData = new Dictionary<string, object> {
                { "title", a.Title ?? "" },
                { "description", a.Description ?? "" },
                { "url", new Uri(baseUrl, a.RelativePath!.Replace(".md",    "")).ToString() }
            }
          },
          Content = new()
          {
            Value = a.Content ?? "",
            Type = ExternalItemContentType.Html
          },
          Acl = new()
          {
              acl
          }
        };
      });
    }
    
  4. Salve suas alterações.

Aplicar as novas ACLs

O passo final é aplicar as ACLs recentemente configuradas.

  1. Abra um terminal e altere o diretório de trabalho para o projeto.
  2. Crie o projeto ao executar o dotnet build comando .
  3. Comece a carregar o conteúdo ao executar o dotnet run -- load-content comando .