Arquivo da categoria: SharePoint 2013

Registrando um Add-in e concedendo permissões utilizando PowerShell

Olá SharePointers,

Muitas vezes é necessário criarmos Add-ins no SharePoint. Entretanto, nem sempre é possível utilizar o modelo SharePoint-hosted.

Para facilitar o processo, podemos utilizar um script powershell para criar um Client ID e fazer o deploy do .app.

$targetWeb = “https://site.sharepoint.com”
$appDisplayName = “App”
$clientID = [Guid]::NewGuid().ToString()

$authRealm = Get-SPAuthenticationRealm -ServiceContext $targetWeb
$AppIdentifier = $clientID + “@” + $authRealm

Write-Host “Creating the new app principal registration…”
Register-SPAppPrincipal -NameIdentifier $AppIdentifier -Site $targetWeb -DisplayName $appDisplayName
$appPrincipal = Get-SPAppPrincipal -Site $targetWeb -NameIdentifier $AppIdentifier

write-host “Display Name:” $appPrincipal.DisplayName
write-host “Name Identifier:” $appPrincipal.NameIdentifier
write-host “ClientID:” $clientID

Write-Host “Uploading the app…”
$spapp = Import-SPAppPackage -Path D:\MyApp.app -Site $targetWeb –Source ObjectModel
$instance = Install-SPApp -Web $targetWeb -Identity $spapp
Write-Host “Granting permissions…”
$web = Get-SPWeb $targetWeb

Set-SPAppPrincipalPermission -Site $web -AppPrincipal $appPrincipal -Scope SiteCollection -Right FullControl

$web.Dispose()

Esse script substitui aquelas operações que temos que fazer nas páginas [SiteUrl]/_layouts/AppRegNew.aspx e [SiteUrl]/_layouts/AppInv.aspx.

 

Esse script funciona tanto para SharePoint On-Premises quanto para SharePoint Online.

 

Referências

http://www.manasbhardwaj.net/powershell-alternative-sharepoint-2013-appregnew-aspx/

Request Digest no SharePoint

Olá SharePointers,

Hoje vou falar um pouco sobre o RequestDigest. Para quem está acostumado a trabalhar com códigos client-side, com certeza já teve que usá-lo para criar itens ou outros objetos no SharePoint.

Toda vez que desejamos alterar algo no SharePoint, precisamos passá-lo no cabeçalho do request para que a operação seja concluída com sucesso. Para evitar ataques, o SharePoint gera um token específico para o usuário atual, site atual e por um tempo específico. Esse token é conhecido como Request Digest ou Form Digest.

Sendo assim, quando for executar uma chamada basta pegar o valor do RequestDigest e colocar no cabeçalho X-RequestDigest, como demonstrado abaixo:

image

Porém, se o usuário abrir a página e deixar aberta, sair do computador por um tempo e depois tentar clicar em algum botão, pode ser que o tempo de duração do token já tenha expirado. 

Para resolver esse problema, existe uma função Javascript que gera um token novo para você: UpdateFormDigest.

Para facilitar o entendimento, criei uma função que chamei de getRequestDigest que sempre me retorna o valor do token e, caso esteja vencido, ele renova o token e me retorna o valor atualizado.

image

e utilizo, onde precisar, essa função.

image

 

Abraços!

Como pegar os anexos de um item de lista através do Search do SharePoint

Olá SharePointers,

Eu estava com a necessidade de mostrar se um item (que era retornado pelo search) tinha anexo ou não. Não encontrei uma propriedade managed ou crawled que pudesse retornar o que eu esperava e estava quase perdendo as esperenças disso funcionar.

Depois de algumas pesquisas, encontrei uma referência a uma propriedade LinkOfficeChild que supostamente deveria trazer o resultado que eu esperava.

Para confirmar, busquei essa propriedade na lista de Managed Properties existente e nenhum resultado apareceu.

image

Abri o Search Query Tool para testar se mesmo assim essa propriedade não era retornada e, para minha surpresa, ela É!

image

 

Referência

http://www.techmikael.com/2014/04/solution-to-displaying-attachments-for.html

SharePoint Workflows–Acessando dados de um outro site

Olá SharePointers,

Hoje vou falar de uma dica muito útil: como acessar dados de um outro site, utilizando workflows. Nesse exemplo, acessarei uma lista do site pai.

O Workflow manager veio para simplificar a forma como os workflows são feitos. De forma declarativa, ficou bem mais simples.

Internamente,  a engine de workflows converte todas as ações em chamadas REST. Resumindo, tudo o que podemos fazer utilizando workflows, podemos fazer utilizando as APIs REST disponíveis.

Introdução

O Workflow roda como um add-in. Dessa forma, ao criar um workflow, ele é autorizado a executar naquele site. Mas, você pode dar permissões para o Add-in e rodar algumas ações em contexto app-only.

Para rodar o exemplo abaixo, é necessário ativar uma feature (de Web) no site que o workflow será criado:

image

Após isso, vá em Configurações do Site e clique  em Permissões de Aplicativo de Site

image

Copie o Id do aplicativo

image

Abra o outro site que deseja consultar informações e abra a página http://[site]/_layouts/15/appinv.aspx

Cole o Id do aplicativo e clique em pesquisa.

image

Cole o xml abaixo no último campo e clique em criar.

Atenção: O xml abaixo está dando permissão Manage em uma lista que você selecionará na próxima tela. Altere o xml conforme a sua necessidade de negócio.

<AppPermissionRequests AllowAppOnlyPolicy="true"> <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list" Right="Manage" /> </AppPermissionRequests>

Aparecerá uma tela para você confiar no Workflow e escolher a lista que deseja extrair informações.

image

 

Workflow

Crie o workflow e adicione um App Step.

image

Coloque uma ação Build Dictionary

Coloque duas entradas no Build Dictionary: Accept e Content-Type com o mesmo valor

image

e outra Call HTTP Web Service

image

Faça a sua chamada REST, clique nas propriedades da ação REST

image

e configure o RequestHeaders para ter o valor da variável que você criou no Build Dictionary

image

Pegue o valor da resposta e utilize-o conforme desejar.

image

 

Conclusão

Demonstrei como acessar dados, via REST, de outro site utilizando o workflow manager. Muitas vezes, por questões de organização e estruturação dos dados, precisamos acessar dados que não estão no site que estamos trabalhando e as APIs REST nos permitem isso de maneira bem simples. Entretanto, pode ser um pouco complicado fazer o passo-a-passo para fazer com que o mesmo processo funcione dentro do workflow.

 

Abraços Smile

Enviar e-mail usando Javascript

Olá SharePointers,

Vocês sabiam que é possível enviar e-mails usando Javascript no SharePoint?

Essa dica funciona tanto no SharePoint On-Prem quanto no SharePoint Online.

Por questões de segurança, o usuário tem que ser do mesmo domínio do SharePoint.

Disponibilizei o código no Github: https://github.com/RARomano/SPRestAPIs/blob/master/SendEmail.js

 

Referência

http://geekswithblogs.net/ThorvaldBoe/archive/2014/07/03/sending-email-with-sharepoint-and-jquery.aspx

 

Abraços!

Aumentando a produtividade com SharePoint Add-ins – Parte 2 (A beleza do Upgrade)

Olá SharePointers,

Fiz um novo post falando de como aumentar a produtividade do desenvolvimento utilizando Add-Ins e publiquei o documento no DOCS.com da Microsoft.

O link para o documento é: https://doc.co/GGzdmo

O projeto está publicado no GitHub.. O link do repositório é: https://github.com/RARomano/SharePointHostedUpdateApp

 

Abraços!

Aumentando a produtividade com SharePoint Add-Ins – Parte 1

Olá SharePointers,

Para quem tem acompanhado os direcionamentos que a Microsoft vem apresentando para modelo de desenvolvimento do SharePoint, principalmente quando o assunto é o SharePoint Online, percebe que o direcionamento é muito forte para os chamados “Add-Ins“.

Já fiz um post falando dos modelos de desenvolvimento disponíveis no SharePoint (http://rodrigoromano.net/2015/01/27/sharepoint-2013-e-seus-modelos-de-desenvolvimento/ e dos “novos” modelos de provisionamento de objetos http://rodrigoromano.net/2015/07/04/modelo-de-provisionamento-de-objetos-no-sharepoint/), mas o foco desse post é falar sobre como tirar proveito dessa nova orientação e criar soluções de negócios que de fato agreguem valor ao negócio do cliente.

Para (re)lembrar: Quando falamos de add-ins (antigamente conhecido como Apps), eles podem ser: SharePoint-hosted ou Provider-hosted.

Muitos desenvolvedores podem falar/pensar assim “Mas eu já tinha um framework que acelerava o meu desenvolvimento utilizando Farm Solutions e agora preciso alterar toda a arquitetura para esse modelo novo?” e a resposta é:

SIM, mas podemos fazer isso utilizando algumas vantagens que esse modelo de add-ins nos apresenta e compensar esse trabalho que teremos (somente na primeira vez).

Pensando nisso, farei alguns posts explicando em como tirar proveito do modelo de add-ins.

 

Contexto

A Microsoft fez vários anúncios recentes que demonstram que a visão dela está mudando, ou melhor, está mudada. Vimos que o código do .NET virou open-source (código disponível no github: https://github.com/dotnet), vimos a apresentação da hololens, do continuum e uma série de novidades que deixaram todos boquiabertos (falei um pouco desse posicionamento nesse post: http://rodrigoromano.net/2015/05/24/novo-posicionamento-da-microsoft-e-projeto-oxford/).

Com tudo isso, podemos notar que a estratégia é simples: permitir a interoperabilidade, ou seja, qualquer plataforma/linguagem poder interagir com recursos Microsoft.

SharePoint-Hosted Add-ins

Quando o assunto é SharePoint-Hosted add-ins, a primeira coisa que vem a nossa cabeça é que nesse modelo não podemos colocar código server-side. Há algum tempo atrás isso era um paradigma, mas acredito que isso já tenha mudado um pouco.. 

Em contrapartida, por só permitir código JavaScript, HTML e CSS, esse modelo nos permite (ou força) a abrirmos os olhos para o movimento do mercado. Para quem trabalha com aplicações front-end, JavaScript é uma ferramenta de trabalho diário. Para facilitar a vida dos desenvolvedores front-end, várias bibliotecas (ou “mini-frameworks”) foram criados e (são criados a todo momento!). É muito provável que enquanto estou escrevendo esse post, tenha alguma biblioteca nova sendo criada 😉

Uma dessas bibliotecas é o Knockout JS.

O Knockout JS é uma biblioteca que facilita (e muito) a vida de um desenvolvedor front-end. Com essa biblioteca, você pode colocar tags no seu código HTML para fazer o “BIND” automático entre um objeto do DOM e uma variável e, dessa forma, quando esse campo for alterado, a variável seja atualizada automaticamente (ou vice-versa). Recomendo a leitura da documentação: http://knockoutjs.com/documentation/introduction.html

Utilizando essa biblioteca, fiz um exemplo (não levou mais de 1 hora para fazer) que demonstra como utilizar o Knockout JS, REST APIs e SharePoint JSOM (JavaScript Object Model) para construir uma App pode ser bem simples e disponibilizei no GitHub: https://github.com/RARomano/KnockoutJSandSharePointHostedApp.

 

Próximos Passos

O meu próximo post apresentará como fazer o upgrade de SharePoint-Hosted add-ins e ver como os recursos que a Microsoft disponibiliza pode ajudar a salvar muito tempo e sermos mais produtivos.

 

Abraços! 😀

 

Modelo de Provisionamento de Objetos no SharePoint

Olá SharePointers,

Hoje vou abordar um assunto que tem mexido com a comunidade de SharePoint ao redor do mundo: Modelo de provisionamento de objetos no SharePoint.

Até agora, versão 2013 do SharePoint, tínhamos, basicamente, uma maneira de fazer isso: utilizando o Feature Framework.

Para quem não sabe, Feature Framework é o método que utilizamos para criarmos definições (em formato XML, conhecido como CAML – Collaborative Application Markup Language (https://msdn.microsoft.com/en-us/library/office/ms462365%28v=office.15%29.aspx)) e disponibilizarmos no SharePoint, através de Features. Sendo assim, quando uma feature é ativada você pode fazer com que objetos “apareçam” no SharePoint quase como mágica, entre eles podemos citar: Listas, Content Types, Arquivos…

Essas features, podem ficar disponíveis para qualquer usuário (que tenha permissões adequadas) ativar e disponibilizar um certo recurso para aquele site.

image

Para muitos, esse comportamento é bem parecido com aquele brinquedo Lego, ou seja, você pode plugar várias peças para montar um “brinquedo” novo.

Por exemplo, se quisermos criar uma lista com alguns campos, podemos utilizar o Wizard que o Visual Studio disponibiliza para nós e visualmente criar o que precisamos facilmente. Veja abaixo:

image

Dessa forma, o Visual Studio faz todo o “trabalho sujo” para nós, gerando o XML que o SharePoint entende:

<?xml version=”1.0″ encoding=”utf-8″?> <List xmlns:ows=”Microsoft SharePoint” Title=”MinhaLista” FolderCreation=”FALSE” Direction=”$Resources:Direction;” Url=”Lists/MinhaLista” BaseType=”0″ xmlns=”http://schemas.microsoft.com/sharepoint/”> <MetaData> <ContentTypes> <ContentTypeRef ID=”0x01″> <Folder TargetName=”Item” /> </ContentTypeRef> <ContentTypeRef ID=”0x0120″ /> </ContentTypes> <Fields> <Field ID=”{fa564e0f-0c70-4ab9-b863-0177e6ddd247}” Type=”Text” Name=”Title” DisplayName=”$Resources:core,Title;” Required=”TRUE” SourceID=”http://schemas.microsoft.com/sharepoint/v3″ StaticName=”Title” MaxLength=”255″ /> </Fields> <Views> <View BaseViewID=”0″ Type=”HTML” MobileView=”TRUE” TabularView=”FALSE”> <Toolbar Type=”Standard” /> <XslLink Default=”TRUE”>main.xsl</XslLink> <RowLimit Paged=”TRUE”>30</RowLimit> <ViewFields> <FieldRef Name=”LinkTitleNoMenu”></FieldRef> </ViewFields> <Query> <OrderBy> <FieldRef Name=”Modified” Ascending=”FALSE”></FieldRef> </OrderBy> </Query> <ParameterBindings> <ParameterBinding Name=”AddNewAnnouncement” Location=”Resource(wss,addnewitem)” /> <ParameterBinding Name=”NoAnnouncements” Location=”Resource(wss,noXinviewofY_LIST)” /> <ParameterBinding Name=”NoAnnouncementsHowTo” Location=”Resource(wss,noXinviewofY_ONET_HOME)” /> </ParameterBindings> </View> <View BaseViewID=”1″ Type=”HTML” WebPartZoneID=”Main” DisplayName=”$Resources:core,objectiv_schema_mwsidcamlidC24;” DefaultView=”TRUE” MobileView=”TRUE” MobileDefaultView=”TRUE” SetupPath=”pages\viewpage.aspx” ImageUrl=”/_layouts/15/images/generic.png?rev=23″ Url=”AllItems.aspx”> <Toolbar Type=”Standard” /> <XslLink Default=”TRUE”>main.xsl</XslLink> <JSLink>clienttemplates.js</JSLink> <RowLimit Paged=”TRUE”>30</RowLimit> <ViewFields> <FieldRef Name=”LinkTitle”></FieldRef> </ViewFields> <Query> <OrderBy> <FieldRef Name=”ID”></FieldRef> </OrderBy> </Query> <ParameterBindings> <ParameterBinding Name=”NoAnnouncements” Location=”Resource(wss,noXinviewofY_LIST)” /> <ParameterBinding Name=”NoAnnouncementsHowTo” Location=”Resource(wss,noXinviewofY_DEFAULT)” /> </ParameterBindings> </View> </Views> <Forms> <Form Type=”DisplayForm” Url=”DispForm.aspx” SetupPath=”pages\form.aspx” WebPartZoneID=”Main” /> <Form Type=”EditForm” Url=”EditForm.aspx” SetupPath=”pages\form.aspx” WebPartZoneID=”Main” /> <Form Type=”NewForm” Url=”NewForm.aspx” SetupPath=”pages\form.aspx” WebPartZoneID=”Main” /> </Forms> </MetaData> </List>

Desvantagens

Entretanto, nem tudo são flores nesse modelo. Embora a Microsoft tenha evoluído bastante os wizards no Visual Studio, hoje é possível criar uma lista, colocar os campos, configurar as suas views e várias outras atividades utilizando esses assistentes, quem conheceu a versão 2007 do SharePoint lembra do trabalho que era para editar esses arquivos manualmente.

Mas, voltando ao mundo de hoje, existem vários problemas com esse modelo:

· Updates e versionamento – Como lidar com isso? Por exemplo, você tem uma lista que já foi instalada no servidor e precisa criar um campo novo… Como proceder? Muito provavelmente a abordagem seria criar uma feature nova que quando fosse ativada provisionasse um novo campo via código. Dessa forma, o seu modelo de provisionamento ficaria uma bagunça e complexo.

· Objetos órfãos – É muito comum você ativar uma custom feature em vários sites e, quando não vai mais utilizar aquele WSP, simplesmente o desinstala. Nem lembra de desativar as features antes.. Isso pode até funcionar naquele momento, mas dará muitas dores de cabeça quando for fazer um upgrade do site.

· Desinstalação – Além disso, quando desativamos uma feature, é muito comum que os objetos criados por aquela feature continuem no servidor ou, ainda pior, fiquem em um estado “fantasma”.

· Curva de aprendizado – Outro problema que esse modelo causava é na curva de aprendizado para dominarmos/sabermos como criar objetos no SharePoint de forma eficiente e correta. E, mesmo os mais experientes, quantas vezes tentamos entender o porquê de alguma funcionalidade não estar funcionando de acordo com o esperado.

· Debug (?) – Debug, ou a falta de debug é mais um problema desse modelo. Quando você precisa entender o motivo de um erro o único local que você pode recorrer é o ULS. E todos sabemos o quanto isso pode ser chato e demorado….

A Microsoft veio, até aqui, evoluindo esse modelo. Mas ele chegou ao fim. Não estou dizendo que a Microsoft vai torna-lo deprecado tão rapidamente, mas isso vai acontecer eventualmente. Basta avaliarmos o esforço que a Microsoft está fazendo no GitHub (OfficePNP) em um novo modelo conhecido como Remote Provisioning, no link Site provisioning techniques and remote provisioning in SharePoint 2013 as principais formas de provisionamento são explicadas: (http://blogs.msdn.com/b/vesku/archive/2013/08/23/site-provisioning-techniques-and-remote-provisioning-in-sharepoint-2013.aspx).

Remote Provisioning

Como solução, ou alternativa, ao Feature Framework, a Microsoft recomenda a utilização do que eles estão chamando de Remote Provisioning.

De maneira bem simples, é você criar todos os objetos utilizando alguma biblioteca client (CSOM, por exemplo) e não ter nenhuma dependência de arquivos que precisam ser armazenados no servidor de SharePoint.

Dessa forma, embora tenhamos que criar mais códigos para atingir o mesmo resultado do que teríamos com o Feature Framework, esse trabalho se dará apenas uma vez. Quando tivermos construído um framework para provisionamento de objetos esse trabalho será bem mais rápido.

Como estamos escrevendo nosso próprio código, conseguimos debugar e ter controle sobre todos os aspectos dos objetos que serão criados.

Uma GRANDE VANTAGEM é que podemos fazer tudo isso sem ter acesso ao servidor. Podemos fazer de qualquer lugar, a única coisa que precisamos é uma credencial com permissões adequadas.

A curva de aprendizado é baixa ou quase nenhuma, pois já estamos em contatos com esses objetos o tempo todo. Interagimos com o List, por exemplo, para acessar uma lista e suas propriedades. De uma maneira superficial, o único conhecimento que você precisará é saber desenvolver utilizando o Client-Object Model.

Quem quiser saber como utilizar esse “pattern” de Remote Provisioning, pode utilizar a documentação já existente no PNP https://github.com/OfficeDev/PnP/tree/master/Scenarios, tem vários cenários que poderão ajudar a entender como utilizar e aplicar o modelo e, inclusive, dar ideias para criarmos os nosso próprios mecanismos de deploy.

Alguns cenários interessantes:

· Criar sites: https://github.com/OfficeDev/PnP/tree/master/Scenarios/Provisioning.CreateSite

· Permissões: https://github.com/OfficeDev/PnP/tree/master/Scenarios/Core.SitePermissions

· Usuários e Grupos: https://github.com/OfficeDev/PnP/tree/master/Scenarios/Core.GroupManagement

· Campos e Content Types: https://github.com/OfficeDev/PnP/tree/master/Scenarios/Core.ContentTypesAndFields

Pensando no cenário de nuvem, Office 365 (SharePoint Online) por exemplo, esse é o único modelo aplicável. Você até poderia utilizar Sandbox solutions para fazer deploy desse tipo de artefato (por enquanto), mas isso pode ser descontinuado a qualquer momento. Além disso, acredito que as vantagens apresentadas nesse modelo já justificam a sua utilização em detrimento à outras formas existentes atualmente.

Comparando com o mesmo cenário apresentado no modelo de Feature Framework, você poderia utilizar o Client Object Model (CSOM) para conectar no site que deseja criar alguma coisa e rodar o código que você já está acostumado para realizar essa tarefa, veja na imagem abaixo como criar uma Lista:

image

Você precisou escrever um pouco de código, sim. Mas, uma vez que esse código tenha sido criado, você irá reaproveitá-lo sempre que precisar.

 

 

Desvantagens

Sobre esse modelo, o que falta é uma maneira mais fácil de utilizar. Depois de tanta evolução no Feature Framework com seus templates de Visual Studio, a vida de um desenvolvedor SharePoint ficou mais fácil.

Acredito que para o modelo de “Remote Provisioning” ser adotado em larga escala e rapidamente, será necessário a criação de templates (Wizards) integrados ao Visual Studio para automatizar as tarefas mais comuns, de maneira simples.

Lembro de como a comunidade gostou de quando a Microsoft anunciou que agora era simples criar uma lista, content type e outros objetos de maneira visual pelo Visual Studio.

Entretanto, pelo quantidade de esforço que está sendo investido nesse modelo, acredito que logo teremos novidades nesse sentido 😀

 

 

 

Conclusão

Nesse post abordei as principais diferenças entre o modelo de deploy de artefatos existente no SharePoint (Feature Framework) e o Remote Provisioning.

Como esse modelo novo, o “Remote Provisioning”, está começando a ser divulgado agora ainda existe uma certa resistência dos profissionais em utilizá-lo. Entretanto, com todas as vantagens abordadas nesse artigo logo você estará utilizando esse modelo e esquecerá de todos os problemas gerados pelo modelo anterior.

Além disso, estou vendo uma grande “onda” a favor do Remote Provisioning. A Microsoft tem feito um grande esforço para que ele seja o modelo de deploy de artefatos. Acredito que, com isso, em algum momento próximo o Feature Framework seja considerado Deprecado.

Acredito que uma grande ressalva é que, para esse modelo de Remote Provisioning funcionar, a Microsoft tem que disponibilizar API Client para tudo que é possível fazer com o SharePoint via UI ou Server OM.

 

 

Agradecimentos

Quero agradecer especialmente ao PFE Fabian Gehrke por dar a ideia de escrever sobre esse assunto, me ajudar na revisão e contribuições para que a informação seja transmitida de forma eficiente.

Conversamos frequentemente sobre esse e vários assuntos pertinentes à plataforma.

Obrigado 😀

 

 

Referências

http://blogs.msdn.com/b/vesku/archive/2013/08/23/site-provisioning-techniques-and-remote-provisioning-in-sharepoint-2013.aspx

http://blogs.msdn.com/b/bobgerman/archive/2015/01/31/new-guidance-from-microsoft-for-packaging-and-deploying-sharepoint-solutions.aspx

https://github.com/OfficeDev/PnP/wiki

http://www.microsoftvirtualacademy.com/training-courses/transform-sharepoint-customizations-to-sharepoint-app-model

Definir tamanho máximo por extensão no SharePoint 2013

Olá SharePointers,

Em alguns cenários, precisamos definir o tamanho máximo dos arquivos que podem ser armazenados em um site no SharePoint.

Para realizar essa configuração, você pode ir na Central Admin, Clicar em Manage Web Applications.

image

Escolha sua Aplicação e clique em General Settings e depois em General Settings.

 

image

 

Procure pelo item Maximum Upload Size. Nesse item, você poderá definir o tamanho máximo (em MB) dos arquivos que serão armazenados no SharePoint.

 

image

 

 

Entretanto, as vezes precisamos ter exceções para algum tipo de extensão ou até mesmo configurar valores diferentes para cada tipo de arquivo.

Para fazer isso, você pode fazer por PowerShell:

1 $webApp = Get-SPWebApplication "[Site URL]" 2 $webApp.MaximumFileSizePerExtension

 

Rodando o código abaixo, você verá que nativamente o SharePoint já tem uma extensão configurada como exceção.

Para arquivos do OneNote, o limite default é de 1 GB.

image

Para adicionar uma extensão, você pode usar o código abaixo:

1 $webApp = Get-SPWebApplication "[Site Url]" 2 $webApp.MaximumFileSizePerExtension.Add("WMV",20) 3 $webApp.Update()

Protegendo Web API utilizando Azure AD e integrando com SharePoint Online usando oAuth

Olá SharePointers,

Hoje vou falar de um cenário Híbrido envolvendo SharePoint Online e Azure.

É comum para nós, especialistas no produto, encontrarmos cada vez mais cenários híbridos e integrados. 

 

Cenário

Tenho uma aplicação desenvolvida em alguma linguagem que está fazendo Single Sign On com o Azure AD utilizando oAuth e OpenID. Basicamente, quando um usuário se loga na aplicação, a aplicação vai até o Azure e solicita um token de acesso para esse recurso. 

Com esse token, preciso conseguir acessar uma Web API que está hospedada no Azure. Essa WebAPI não permite acesso anônimo. Para acessar essa API, eu devo utilizar o token de acesso recebido na etapa anterior. Por questões de segurança, eu não tenho acesso a credencial do usuário (usuário e senha).

Após autenticado, essa WebApi fará um request para o SharePoint Online, utilizando o token do usuário que se logou na primeira aplicação. 

 

 

Tem uma série de leituras interessantes sobre o assunto e vários exemplos na internet, mas nenhum mostrava como fazer as duas partes. É comum encontrar um exemplo de como proteger a WebApi ou como acessar o SharePoint online utilizando AccessTokens, mas nenhum faz essa ligação direta.

Pensando nessa dificuldade criei um Projeto no GitHub https://github.com/RARomano/AzureAD-WebAPI-SPOnline que demonstra, passo-a-passo, como fazer essa integração de forma simples.

Estou seguindo o mesmo modelo de aplicações que o time de Azure e a comunidade americana estão construindo, veja mais informações aqui: https://github.com/AzureADSamples.

O MVP de SharePoint Andrew Connell fez vários posts legais sobre o assunto e estão na seção “Referências” abaixo.

 

Basicamente, o que acontece por trás dos panos é o seguinte:

  1. O Usuário acessa a aplicação. 
  2. Windows Azure redireciona para página de Login
  3. O usuário faz o login
  4. A aplicação recebe um access token
  5. A aplicação faz um request para WebAPI utilizando esse token
  6. A Web API solicita um outro token para acessar o SharePoint e traz os dados desejados

É importante ressaltar que, nesse cenário, estamos utilizando o modelo App+User, ou seja, aplicação do Azure está agindo como se fosse o usuário. Inclusive, se você fizer uma operação que adicione ou modifique um item, no campo Modificado/Criado por aparecerá:

Criado por [nome do app] em nome do [Usuário]

 

 

Pensando em facilitar a nossa vida e facilitar esse processo de obter os tokens, criaram uma biblioteca denominada ADAL.NET (https://github.com/AzureAD/azure-activedirectory-library-for-dotnet). Ela ajuda e muito no processo. Estou utilizando essa biblioteca nos exemplos que fiz, mas todo o processo poderia ser feito de maneira manual fazendo HTTP Requests manuais para o Azure AD.

 

Referências

http://bitoftech.net/2014/09/12/secure-asp-net-web-api-2-azure-active-directory-owin-middleware-adal/

http://blogs.technet.com/b/ad/archive/2015/03/06/simplifying-our-azure-ad-authentication-flows.aspx

https://github.com/AzureADSamples

https://msdn.microsoft.com/en-us/library/azure/jj573266.aspx

https://msdn.microsoft.com/en-us/library/azure/dn499820.aspx

http://www.andrewconnell.com/blog/user-app-app-only-permissions-client-credentials-grant-flow-in-azure-ad-office-365-apis

http://www.andrewconnell.com/blog/looking-at-the-different-oauth2-flows-supported-in-azuread-for-office-365-apis

https://msdn.microsoft.com/pt-br/library/azure/jj573266.aspx

http://www.cloudidentity.com/blog/2013/09/12/active-directory-authentication-library-adal-v1-for-net-general-availability/

https://github.com/AzureAD/azure-activedirectory-library-for-dotnet