Criar um aplicativo cliente nativo usando clientes públicos OAuth com AD FS 2016 ou posterior

Visão geral

Este artigo mostra como criar um aplicativo nativo que interage com uma API Web protegida pelo AD FS 2016 ou posterior.

  1. O aplicativo WPF .Net TodoListClient usa o Biblioteca de Autenticação do Active Directory (ADAL) para obter um token de acesso JWT do Azure Active Directory (Azure AD) por meio do protocolo OAuth 2.0
  2. O token de acesso é usado como um token de portador para autenticar o usuário ao chamar o ponto de extremidade /todolist da API Web TodoListService. Vamos usar o exemplo de aplicativo para o Azure AD aqui e, em seguida, modificá-lo para o AD FS 2016 ou posterior.

Application overivew

Pré-requisitos

Veja a seguir uma lista de pré-requisitos necessários antes de concluir este documento. Este documento pressu que AD FS foi instalado e um farm AD FS foi criado.

  • GitHub de cliente
  • AD FS no Windows Server 2016 ou posterior
  • Visual Studio 2013 ou posterior.

Criando o passo a passo de exemplo

Criar o grupo de aplicativos AD FS

  1. No Gerenciamento dos AD FS, clique com o botão direito do mouse em Grupos de Aplicativos e selecione Adicionar Grupo de Aplicativos.

  2. No Assistente de Grupo de Aplicativos, para o nome, insira qualquer nome que você preferir, por exemplo, NativeToDoListAppGroup. Selecione o aplicativo nativo que acessa um modelo de API Web . Clique em Próximo. Add application group

  3. Na página Aplicativo nativo, observe o identificador gerado por AD FS. Essa é a ID com a qual AD FS reconhecerá o aplicativo cliente público. Copie o valor Identificador de Cliente. Ele será usado posteriormente como o valor para ida:ClientId no código do aplicativo. Se você quiser, poderá dar qualquer identificador personalizado aqui. O URI de redirecionamento é qualquer valor arbitrário, por exemplo, put https://ToDoListClienthttps://ToDoListClient

  4. Na página Configurar API Web, de definido o valor do identificador para a API Web. Para este exemplo, esse deve ser o valor da URL SSL em que o aplicativo Web deve estar em execução. Você pode obter esse valor clicando nas propriedades do projeto TooListServer na solução. Isso será usado posteriormente como o valor todo:TodoListResourceId no arquivo App.config do aplicativo cliente nativo e também como todo:TodoListBaseAddress. Web API

  5. Acesse Aplicar Política de Controle de Acesso e Configurar Permissões de Aplicativo com os valores padrão em prática. A página de resumo deve ter a aparência abaixo. Summary

Clique em Próximo e conclua o assistente.

Adicionar a declaração NameIdentifier à lista de declarações emitidas

O aplicativo de demonstração usa o valor na declaração NameIdentifier em vários locais. Ao contrário do Azure AD, AD FS não emite uma declaração NameIdentifier por padrão. Portanto, precisamos adicionar uma regra de declaração para emitir a declaração NameIdentifier para que o aplicativo possa usar o valor correto. Neste exemplo, o nome determinado do usuário é emitido como o valor NameIdentifier para o usuário no token. Para configurar a regra de declaração, abra o grupo de aplicativos que acabou de criar e clique duas vezes na API Web. Selecione a guia Regras de Transformação de Emissão e clique no botão Adicionar Regra. No tipo de regra de declaração, escolha Regra de declaração personalizada e adicione a regra de declaração, conforme mostrado abaixo.

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"), query = ";givenName;{0}", param = c.Value);

NameIdentifier claim rule

Modificar o código do aplicativo

Esta seção discute como baixar a API Web de exemplo e modificá-la Visual Studio. Vamos usar o exemplo do Azure AD que está aqui.

Para baixar o projeto de exemplo, use o Git Bash e digite o seguinte:

git clone https://github.com/Azure-Samples/active-directory-dotnet-native-desktop

Modificar ToDoListClient

Esse projeto na solução representa o aplicativo cliente nativo. Precisamos garantir que o aplicativo cliente saiba:

  1. Onde ir para fazer com que o usuário seja autenticado quando necessário?
  2. Qual é a ID que o cliente precisa fornecer à autoridade de autenticação (AD FS)?
  3. Qual é a ID do recurso para o qual estamos solicitando o token de acesso?
  4. Qual é o endereço base da API Web?

As alterações de código a seguir são necessárias para obter as informações acima para o aplicativo cliente nativo.

App.config

  • Adicione a chave ida:Authority com o valor ilustrando o AD FS serviço. Por exemplo, https://fs.contoso.com/adfs/

  • Modifique a chave ida:ClientId com o valor do Identificador do Cliente na página Aplicativo Nativo durante a criação do Grupo de Aplicativos AD FS. Por exemplo, 3f07368b-6efd-4f50-a330-d93853f4c855

  • Modifique todo:todo:TodoListResourceId com o valor do Identificador na página Configurar API Web durante a criação do Grupo de Aplicativos AD FS. Por exemplo, https://localhost:44321/

  • Modifique todo:TodoListBaseAddress com o valor do Identificador na página Configurar API Web durante a criação do Grupo de Aplicativos AD FS. Por exemplo, https://localhost:44321/

  • De definir o valor de ida:RedirectUri com o valor do URI de Redirecionamento na página Aplicativo nativo durante a criação do Grupo de Aplicativos no AD FS. Por exemplo, https://ToDoListClient

  • Para facilitar a leitura, você pode remover/comentar a chave para ida:Tenant e ida:AADInstance.

    App config

MainWindow.xaml.cs

  • Comente a linha para aadInstance conforme abaixo

    // private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];

  • Adicione o valor de autoridade conforme abaixo

    private static string authority = ConfigurationManager.AppSettings["ida:Authority"];

  • Excluir a linha para criar o valor da autoridade de aadInstance e do locatário

    private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

  • Na função MainWindow, altere a instaência authContext para

    authContext = new AuthenticationContext(authority,false);

    A ADAL não dá suporte à validação AD FS como autoridade e, portanto, precisamos passar um sinalizador de valor falso para o parâmetro validateAuthority.

    Main window

Modificar TodoListService

Dois arquivos precisam de alterações neste projeto – Web.config e Startup.Auth.cs. Web.Config alterações são necessárias para obter os valores corretos dos parâmetros. As alterações de Startup.Auth.cs são necessárias para definir o WebAPI para autenticação no AD FS em vez do Azure AD.

Web.config

  • Comente a chave ida:Tenant, pois não precisamos dela
  • Adicione a chave para ida:Authority com valor que indica o FQDN do serviço de federação, por exemplo,
  • Modifique a chave ida:Audience com o valor do identificador de API Web especificado na página Configurar API Web durante Adicionar Grupo de Aplicativos AD FS.
  • Adicione a chave ida:AdfsMetadataEndpoint com o valor correspondente à URL de metadados de federação do serviço AD FS, por exemplo:

Web config

Startup.Auth.cs

Modifique a função ConfigureAuth conforme abaixo

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseActiveDirectoryFederationServicesBearerAuthentication(
            new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            {
                MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                TokenValidationParameters = new TokenValidationParameters()
                {
                    SaveSigninToken = true,
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                }

            });
    }

Essencialmente, estamos configurando a autenticação para usar o AD FS e fornecer mais informações sobre os metadados do AD FS e, para validar o token, a declaração de público-alvo deve ser o valor esperado pela API Web. Executando o aplicativo

  1. Na solução NativeClient-DotNet, clique com o botão direito do mouse e vá para propriedades. Altere a configuração Project como mostrado abaixo para Vários projetos de Inicialização e defina TodoListClient e TodoListService como Start. Solution properties

  2. Pressione o botão F5 ou selecione Depurar > Continuar na barra de menus. Isso iniciará o aplicativo nativo e o WebAPI. Clique no botão Entrar no aplicativo nativo e ele abrirá um logon interativo do AD AL e será redirecionado para o AD FS serviço. Insira as credenciais de um usuário válido. Screenshot showing the sign in dialog box.

Nesta etapa, o aplicativo nativo redirecionado para AD FS e recebeu um token de ID e um token de acesso para a API Web

  1. Insira um item para fazer na caixa de texto e clique em Adicionar item. Nesta etapa, o aplicativo acessa a API Web para adicionar o item a ser AD FS. A API Web corresponde ao valor do público-alvo para verificar se o token é destinado a ele e verifica a assinatura do token usando as informações dos metadados de federação.

Sign-in

Próximas etapas

Desenvolvimento do AD FS