AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-3960154

B Reed's questions

Martin Hope
B Reed
Asked: 2025-04-10 03:04:56 +0800 CST

Envelope DocuSign distinguindo entre tipos numéricos e numéricos no modelo

  • 8

Tenho um modelo que estou passando com sucesso TextTabs e CheckboxTabs; no entanto, meus NumberTabs não estão sendo exibidos. Estou lendo sobre Tabulações Numéricas vs. Tabulações Numéricas. Verifiquei novamente e parece que o modelo está configurado com Number. Consigo ver o valor antes de enviar para o DocuSign. Mas quando o envelope é aberto, ele não está lá.

Devo usar Numérico? Alguma outra ideia do que está faltando?

Atualização: Testei Numérico e funcionou. Nova pergunta: Como posso saber se era Numérico no modelo?

   Number n = new Number
   {
        TabLabel = kvp.Key,// name of DS field, e.g. amount
        Value = kvp.Value //e.g. 25.53
   };

   List<Number>? numTabs = [];
   numTabs.Add(n);

   tabs ??= new Tabs();
   tabs.NumberTabs = numTabs ;

   //continue to populate envelope/signer information in envelope definition

Esta é a definição do meu campo de modelo DocuSign, por exemplo, valor:

captura de tela

docusignapi
  • 1 respostas
  • 21 Views
Martin Hope
B Reed
Asked: 2025-03-29 02:19:09 +0800 CST

Configuração do caminho do DocuSignClient com base no ambiente

  • 5

Desenvolvendo um aplicativo interno da organização para enviar envelopes/ter assinatura incorporada usando os SDKs C# do DocuSign. Seguindo os exemplos do Quickstart, consigo fazer essas ações. Como ele usa os ambientes de demonstração/teste do DocuSign, quando esse aplicativo for implantado, o código precisará fazer chamadas para o ambiente de produção do DocuSign.

Como os funcionários da organização usarão este aplicativo, não os clientes, o código usa Concessões de Código de Autorização, não Tokens JWT.

  1. Então, com a obtenção do token de acesso, o código deve chamar SetOAuthBasePath de sua instância de DocuSignClient? O SDK diz "Use este método para definir o caminho base OAuth personalizado". Mas como o DocuSign saberá o contrário?

  2. Eu assumo que a chamada de endpoint UserInfo para o BaseUri do usuário já terá o ambiente correto (já que eles foram autenticados), e o BaseUri estaria então 'apontando' para o ambiente apropriado. Verdade?

Vejo que o C# SDK tem constantes que podemos referenciar. Devo usá-las para definir quando estou no meu ambiente de produção:

public class DocuSignClient
{
    public const string Production_REST_BasePath = "https://www.docusign.net/restapi";

    public const string Demo_REST_BasePath = "https://demo.docusign.net/restapi";
...
}
public class OAuth
{
...
    public static string Demo_OAuth_BasePath = "account-d.docusign.com";

    public static string Production_OAuth_BasePath = "account.docusign.com";
}

Exemplo de código em vez de DocuSignClient docuSignClient = new DocuSignClient():

protected DocuSignClient GetDocuSignClient(bool isForAuth, bool useProd, string? userBaseUri = null)
{
    DocuSignClient rtn = new DocuSignClient();

    //DocuSignClient defaults to demo environment
    if (isForAuth && useProd)
    {
        rtn.SetOAuthBasePath(OAuth.Production_OAuth_BasePath);
    }
    
    if (!isForAuth && !string.IsNullOrEmpty(userBaseUri))
    {
        //we should have a User BaseUri, which will be based on the environment authenticated 
        rtn.SetBasePath(userBaseUri);
    }
    return rtn;
}
docusignapi
  • 1 respostas
  • 25 Views
Martin Hope
B Reed
Asked: 2025-03-23 19:40:18 +0800 CST

ASP.NET Core MVC com múltiplas necessidades de autenticação Oauth

  • 6

Ao criar uma nova solução interna (usando ASP.NET Core MVC), nossa política é autenticar usando nosso Active Directory (também conhecido como Entra) para nossos usuários. Este novo aplicativo então coleta dados que então geram um objeto DocuSign usando sua API/SDKs. Esta é a primeira vez que preciso chamar APIs via SDK, e estou um pouco confuso com a mecânica. Quero seguir as melhores práticas de segurança. O DocuSign recomenda que quando o usuário estiver presente use o Confidential Authorization Code Grant, e fornece exemplos. No entanto, não acho que os exemplos que modificam Program.cs (exemplos mostram usando Startup.cs de versões mais antigas do .NET) funcionem quando combinados com a autenticação Entra.

Resumindo, esta solução deve funcionar desta maneira:

  1. Todos os usuários são autenticados via Entra ID (Azure AD). (Veja o destaque amarelo)
  2. Após a autenticação, os usuários podem executar ações que podem exigir a chamada de APIs do DocuSign usando o Fluxo de Código de Autorização OAuth 2.0.

Minhas perguntas (após a atualização, ainda gostaria de entender as 2 primeiras perguntas) :

  1. Acredito (mas não tenho 100% de certeza) que o Entra não usa autenticação de cookies. E não devemos mudar isso.

  2. É possível ter múltiplas Autenticações em um único aplicativo como descrevi usando Program.cs AddAuthentication()? Qual é o propósito de EnableTokenAcquisitionToCallDownstreamApi(), é usar as credenciais do usuário para obter outros dados que essas credenciais permitem?

  3. (Respondido com atualização - Encontrei outra maneira de fazer isso funcionar) Acredito que eu deveria tentar AddAuthentication()em Program.cs, em vez de criar solicitações HttpClient, escrever código em controladores para obter o token de acesso e, então, de alguma forma, persistir para chamar as outras APIs do DocuSign. Pensei que encontraria exemplos disso, mas vejo principalmente exemplos usando tokens JWT, para chamadas de API para API. Verdade? Resposta: Sim

Atualização: Por fim, removi o segundo AddAuthentication() do Program.cs:

// Add Entra authentication
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
//pulled out all the other AddAuth, AddOauth... 

Eu uso meus controladores para chamar o Docusign SDK. Há um documento que, na parte inferior, tem a classe e os métodos que funcionaram: https://developers.docusign.com/platform/auth/confidential-authcode-get-token/

Usei 3 métodos DocuSignClient.cs na minha camada de controlador. (Veja o código da classe aqui https://github.com/docusign/docusign-esign-csharp-client/blob/master/sdk/src/DocuSign.eSign/Client/DocuSignClient.cs )

GetAuthorizationUri(), GenerateAccessToken(),GetUserInfo()

Funcionou. Talvez a DocuSign forneça exemplos e amostras usando estes, eu não encontrei nenhum, mas foi bem direto. Não estava no código QuickStart deles.

Original: Quando tento o código de exemplo (trechos abaixo), eu autentico com sucesso com o Entra, e quando navego para o controlador com autenticação DocuSign, sou solicitado a fornecer minhas credenciais DocuSign. Tudo bem. Com um ponto de interrupção no OnCreatingTicket, eu passo por essa parte da autenticação. No entanto, depois disso, recebo uma exceção abaixo. Todas as pesquisas sobre isso dizem que preciso habilitar cookies no meu esquema de autenticação padrão. O que eu não quero fazer.

Exceção:

The authentication handler registered for scheme 'OpenIdConnect' is 'OpenIdConnectHandler' which cannot be used for SignInAsync. The registered sign-in schemes are: Cookies.

Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>.HandleRequestAsync()
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
        var builder = WebApplication.CreateBuilder(args);
        
        // Add Entra authentication
        builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
        
        
        // Add DocuSign authentication
        builder.Services.AddAuthentication(options =>
                    {
                        options.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                        options.DefaultChallengeScheme = "DocuSign";
                    })
                    .AddCookie()
                    .AddOAuth("DocuSign", options =>
                    {
                        options.ClientId = this.Configuration["DocuSign:ClientId"];
                        options.ClientSecret = this.Configuration["DocuSign:ClientSecret"];
                        options.CallbackPath = new PathString("/ds/callback");
                        options.AuthorizationEndpoint = this.Configuration["DocuSign:AuthorizationEndpoint"];
                        options.TokenEndpoint = this.Configuration["DocuSign:TokenEndpoint"];
                        options.UserInformationEndpoint = this.Configuration["DocuSign:UserInformationEndpoint"];
        
        options.Events = new OAuthEvents
        {
            OnCreatingTicket = async context =>
            {
                var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
                var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                response.EnsureSuccessStatusCode();
                var user = JObject.Parse(await response.Content.ReadAsStringAsync());
                user.Add("access_token", context.AccessToken);
                user.Add("refresh_token", context.RefreshToken);
                user.Add("expires_in", DateTime.Now.Add(context.ExpiresIn.Value).ToString());
                using (JsonDocument payload = JsonDocument.Parse(user.ToString()))
                {
                    context.RunClaimActions(payload.RootElement);
                }
            }
    
    //lines 151 - 244 from https://github.com/docusign/code-examples-csharp/blob/master/launcher-csharp/Startup.cs
    
    // Add controllers and Razor pages with Auth
    builder.Services.AddControllersWithViews(options =>
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticateUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    }).AddMicrosoftIdentityUI();

    —-----------------
    [Authorize(AuthenticationSchemes = "DocuSign")]
    public IActionResult Login(string authType = "CodeGrant", string returnUrl = "/")
    {
        if (authType == "CodeGrant") 
        {
            return Challenge(new AuthenticationProperties() { RedirectUri = returnUrl });
        }
    }

Aqui está a documentação do DocuSign que usei como orientação: https://developers.docusign.com/docs/esign-rest-api/sdks/csharp/auth/

  • 1 respostas
  • 35 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve