Бот выдает ошибку недопустимого символа после публикации на azure, но на эмуляторе работает нормально - PullRequest
0 голосов
/ 20 февраля 2020

У меня бот, созданный с использованием framework v4 с c#. Я использую azure объявление для аутентификации в боте. Я следовал этому документу https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0&tabs=csharp т.е. аутентификация бота. Возвращает токен из azure объявления. Я конвертирую токен и получаю имя пользователя и другую информацию о пользователе. Работает нормально на эмуляторе, но не работает при публикации на azure или других каналах.

Если вы посмотрите мой код, строка ниже выдает ошибку в azure веб-чате. byte [] data = System.Convert.FromBase64String (result);

Ошибка говорит, что она содержит ** Входные данные не являются допустимой строкой Base-64, так как содержат неосновную 64 символа, более двух символов заполнения или недопустимый символ среди символов заполнения. *

Но этот же код дает мне информацию о пользователе на эмуляторе, и даже токен конвертируется в локальный. Можно было столкнуться с этой проблемой. Пожалуйста, помогите мне.

Бот выдает ошибку. Код главного диалога

  public class MainDialog : ComponentDialog
    {
    private const string UserInfo = "value-userInfo";
    private readonly IBotServices _botServices;
    protected readonly ILogger _logger;
    private readonly UserState _userState;
    private readonly string _connectionName;
    private readonly IConfiguration _configuration;
    public MainDialog(IConfiguration configuration, ILogger<MainDialog> logger, IBotServices botServices, UserState userState)
       : base(nameof(MainDialog))
   // public MainDialog(IConfiguration configuration,ILogger<MainDialog> logger, IBotServices botServices)
   //     : base(nameof(MainDialog))
    {
        _userState = userState;
        _configuration = configuration;
        _logger = logger;
        _botServices = botServices ?? throw new System.ArgumentNullException(nameof(botServices));
       _connectionName = configuration["ConnectionName"];
        AddDialog(new TextPrompt(nameof(TextPrompt)));
        AddDialog(new OAuthPrompt(nameof(OAuthPrompt), 
          new OAuthPromptSettings
          {
              ConnectionName = configuration["ConnectionName"],
              Text = "Please Sign In",
              Title = "Sign In",
              Timeout = 300000, // User has 5 minutes to login (1000 * 60 * 5)
           }));
       AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
       AddDialog(new ChoicePrompt(nameof(OAuthPrompt)));
        AddDialog(new luisandqnamakerDialog(_botServices,_configuration,_logger));
        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
        {
            PromptStepAsync,
            LoginStepAsync}));
       // The initial child Dialog to run.
        InitialDialogId = nameof(WaterfallDialog);
    }
    private async Task<DialogTurnResult> PromptStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        stepContext.Values[UserInfo] = new Userdetails();
        var options = new PromptOptions()
        {
            Prompt = MessageFactory.Text("Welcome user, Please Sign In  "),
            RetryPrompt = MessageFactory.Text("That was not a valid choice, please Sign In "),
        };
       return await stepContext.PromptAsync(nameof(OAuthPrompt), options, cancellationToken);
    }
    private async Task<DialogTurnResult> LoginStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {   // Get the token from the previous step. Note that we could also have gotten the
        // token directly from the prompt itself. There is an example of this in the next method.
        var tokenResponse = (TokenResponse)stepContext.Result;
        var token = tokenResponse.Token;
       int start = token.IndexOf(".") + 1;
       int end = token.LastIndexOf(".");
       string result = token.Substring(start, end - start);                    
       byte[] data = System.Convert.FromBase64String(result);
       var details = System.Text.ASCIIEncoding.ASCII.GetString(data);                 
       Userdetails userDetails = JsonConvert.DeserializeObject<Userdetails>(details);
       var userStateAccessors = _userState.CreateProperty<Userdetails>(nameof(Userdetails));
      var userinfo = await userStateAccessors.GetAsync(stepContext.Context, () => newUserdetails());
      userinfo.name = userDetails.name;
       userinfo.email = userDetails.email;
     if (tokenResponse != null)
        {
            if (IsAuthCodeStep(stepContext.Context.Activity.Text))
            { await stepContext.Context.SendActivityAsync(MessageFactory.Text("You are now loggedin."), cancellationToken);
                //SendEmail(userinfo.name, userinfo.email);                
                return await stepContext.NextAsync();
            }
            else
            {
                 await stepContext.PromptAsync(nameof(luisandqnamakerDialog), new PromptOptions { Prompt = MessageFactory.Text("Would you like to ask your question?") }, cancellationToken);
                return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
            }
        } await stepContext.Context.SendActivityAsync(MessageFactory.Text("Login was not successful please try again."), cancellationToken);
   return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
    }
    private bool IsAuthCodeStep(string code)
    {
        if (string.IsNullOrEmpty(code) || !code.Length.Equals(6)) return false;
        if (!int.TryParse(code, out int result)) return false;
        if (result > 1) return true;                
        return false;
    }
    protected override async Task<DialogTurnResult> OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken = default(CancellationToken))
    {
        var result = await InterruptAsync(innerDc, cancellationToken);
        if (result != null)
        {
            return result;
        }
     return await base.OnBeginDialogAsync(innerDc, options, cancellationToken);
    }
      protected override async Task<DialogTurnResult> OnContinueDialogAsync(DialogContext innerDc, 
      CancellationToken cancellationToken = default(CancellationToken))
    {
        var result = await InterruptAsync(innerDc, cancellationToken);
        if (result != null)
        {
            return result;
        }
     return await base.OnContinueDialogAsync(innerDc, cancellationToken);
    }
private async Task<DialogTurnResult> InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken = default(CancellationToken))
    {
        if (innerDc.Context.Activity.Type == ActivityTypes.Message)
        {
            var text = innerDc.Context.Activity.Text.ToLowerInvariant();
           if (text == "logout")
            {// The bot adapter encapsulates the authentication processes.
                var botAdapter = (BotFrameworkAdapter)innerDc.Context.Adapter;
                await botAdapter.SignOutUserAsync(innerDc.Context, _connectionName, null, cancellationToken);
                await innerDc.Context.SendActivityAsync(MessageFactory.Text("You have been signed out."), cancellationToken);
                return await innerDc.CancelAllDialogsAsync(cancellationToken);
            }
        }return null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...