Сохранение информации в базе данных, а затем отправка запроса во внешний API с использованием .NET CORE. - PullRequest
1 голос
/ 28 июня 2019

Я новичок в .NET CORE и пытаюсь работать с внешними API, использующими архитектуру MVC приложения .NET CORE.Как новичку, мне действительно трудно понять основную причину MVC, хорошо сказав, что я провел свое собственное исследование и многое понял.Прямо сейчас у меня есть два вопроса (1-й о предложении Как начать, 2-й о работе, которую я проделал до сих пор)

Вопрос 1 (Предложение) Итак, как я сказал, япытаюсь работать над вызовом внешнего API с использованием архитектуры MVC.То, что я хочу сделать, это предположить, что администратор регистрируется в первый раз, первое имя пользователя и пароль по умолчанию - «admin» и «myadminpassword» соответственно.Для входа в систему администратор должен предоставить новый пароль, который отправляется в виде тела запроса в API.Теперь я хочу сохранить этот новый пароль в моей БД, а затем оттуда в конечную точку API.Это выполнимо?и это хорошая идея?

Вопрос 2 (Подход до сих пор)

Так что получение справки из множества учебных пособий ниже - это мой код, который я делал до сих пор.

Main_Application / Области / Приложение / Вид / Главная / Index.cshtml

@using (Html.BeginForm("Login", "WhAuth", FormMethod.Post))
{
    <label>
        Username:
        <input type="text" placeholder="admin" readonly />
    </label>
    <br />
    <label>
        Password:
        <input type="text" placeholder="*****" readonly />
    </label>
    <br />
    <label>
        Enter New Password:
        @Html.TextAreaFor(m => m.New_password, 5,5,new { })
    </label>
    <br />
    <button class="btn btn-default" type="submit">Sign up as Admin</button>
}

Main_Application / Области / Приложение / Модели / AdminLoginModel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace PTCConnector.Areas.Whatsapp.Models
{
    public class AdminLoginModel
    {
        public string Df_username = "admin";
        public string Df_password = "anySecretPassword";
        [Required(ErrorMessage = "New Password Is Required")]
        public string New_password { get; set; }

    }
}

Main_Application / Models / DB / whapp.cs

public class whapp : BaseEntity
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string New_Password { get; set; }
    public string Token { get; set; }
    public string WhatsappId { get; set; } //Whatsapp ID
    public string type { get; set; }
    public string recipient_type { get; set; }
    public string Messagebody { get; set; }
    public string URL { get; set; }
    public string Group_id { get; set; }
    public string Caption { get; set; }
    public string Media_Id { get; set; }
    public string Status { get; set; }
    public string GroupName { get; set; }
}

Main_Application / Data / ApplicationDBContext.cs

public DbSet<whapp> whapp { get; set; }

Main_Application / Области / Приложение / Контроллеры / WhAuthController.cs

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using PTCConnector.Areas.Whatsapp.Models;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace PTCConnector.Areas.Whatsapp.Controllers
{
    [Area("Whatsapp")]
    [TypeFilter(typeof(AdminActionFilter))]
    [Authorize(Roles = "Admin")]
    public class WhAuthController : Controller
    {
        public AdminLoginModel whLogin = new AdminLoginModel();

        public async Task Login()
        {
            HttpClientHandler clientHandler = new HttpClientHandler
            {
                ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
            };
            var client = new HttpClient(clientHandler);

            byte[] bytes = Encoding.UTF8.GetBytes($"{whLogin.Df_username}:{whLogin.Df_password}");

            var Base64Credentials = Convert.ToBase64String(bytes);

            System.Diagnostics.Debug.WriteLine(Base64Credentials);

            // Set Base64Credentials as Authorization header with Prefix 
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Base64Credentials);

            // Just some data for POST, change freely!
            var data = new Dictionary<string, string>
            {
                { "new_password", $"{whLogin.New_password}" } //
            };
            System.Diagnostics.Debug.WriteLine(data.Values);
            Console.WriteLine("here 1");
            // Encode the data in FORM URL Data
            var content = new FormUrlEncodedContent(data);



            // Make Async Post Call with Client. Parameters are URL and Data to POST!
            var response = await client.PostAsync("https://localhost:9090/v1/users/login", content);

            // Async!! - Read the response content as String
            var responseString = await response.Content.ReadAsStringAsync();

            // Print out the Response String for Debugging!
            //Console.WriteLine(responseString);

            System.Diagnostics.Debug.WriteLine(responseString);
            System.Diagnostics.Debug.WriteLine("Check");
            Console.WriteLine("CheckNow");
        }
    }
}

Main_Application / Startup.cs

 services.AddDbContext<ApplicationDbContext> ... //

            services.AddHttpClient("WhappClient", client =>
            {
                client.BaseAddress = new Uri("https://localhost:9090/v1/users/login");
                client.DefaultRequestHeaders.Add("username", "admin");
                client.DefaultRequestHeaders.Add("password", "anySecretPassword");
            });

Все работает нормально, моя главная цель - также разместить данные в базе данных, чтобы можно было сохранить информацию, а также возвращаемый результат API также необходимо сохранить в базе данных для будущего использования.

Редактировать Приложение работает на Docker-контейнере путьиз которых https://localhost:9090/ Моя цель состоит в том, чтобы, когда пользователь заполнил информацию о new_password в поле ввода и нажал submit, приложение должно нажать на контроллере новый_пароль, как показано ниже.

var data = new Dictionary<string, string>
            {
                { "new_password", $"{whLogin.New_password}" } //
            };

, который затемпри достижении определенной конечной точки, как упоминалось await client.PostAsync("https://localhost:9090/v1/users/login", content);, возвращением будет токен, который я хочу сохранить в базе данных для будущих вызовов конечной точки, кроме того, заданный новый_пароль также будет сохранен в формате хэша в моей базе данных.

1 Ответ

1 голос
/ 29 июня 2019

Начало ответа, так как я пока не могу просто комментировать. Можете ли вы предоставить дополнительную информацию и контекст относительно того, что вы пытаетесь достичь здесь? Какова цель внешнего API, поскольку он представляется другим локальным проектом? Является ли проект, который мы рассматриваем, проектом MVC или проектом Web API? Является ли пользовательское хранилище локальным или вы используете внешний поставщик удостоверений?

Итак, вы взяли некоторые входные данные, закодировали их в виде строки Base64 и затем отправили в другой локальный API. Где хранится база данных, о которой вы упоминали? Кроме того, если вы храните пароль в базе данных, убедитесь, что вы предприняли необходимые шаги для хеширования и засолки его перед сохранением. Честно говоря, вы должны просто использовать встроенную ASP.NET Identity, если вам нужна среда пользователя / аутентификации. Как кто-то еще прокомментировал, где вы зависаете, что не так?

Надеюсь, это не звучит допросом со всеми вопросами, лол! Я просто уверен, что мы могли бы помочь еще немного, если бы мы получили больше информации и подробностей о том, что происходит. Если вы можете предоставить некоторую эту информацию, я могу отредактировать свой ответ, чтобы, надеюсь, получить дополнительную помощь.

...