3

Сценарий:Использование Cookies на основе аутентификации в WebAPI и основные asp.net

У меня есть решение, в котором я есть и WebAPI и проект Asp.Net MVC сердечника. Я реализовал аутентификацию на основе файлов cookie в WebAPI. Он отлично работает при тестировании с помощью Postman. Но когда я использую службу WebAPI из моего проекта MVC, аутентификация, похоже, нарушена.

Вот мой код:

WebAPI:

Startup.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
{ 
    AuthenticationScheme = "ApiAuth", 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = false 
}); 

AccountController.cs

[HttpPost] 
[Route("authenticate")] 
public IActionResult Authenticate([FromBody]LoginModel login) 
{ 
    if (_accountManager.Authenticate(login)) 
    { 
     var identity = new ClaimsIdentity("password"); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "User")); 
     HttpContext.Authentication.SignInAsync("ApiAuth", new ClaimsPrincipal(identity)).Wait(); 
    } 
    else 
    { 
     return Unauthorized(); 
    } 
    return Ok(_accountManager.Authenticate(login)); 
} 

Все контроллеры имеют этот атрибут [Authorize(Roles = "User")]

MVC App:

AccountController.cs

public async Task<IActionResult> Login(LoginModel loginModel) 
{ 
    var loginFlag = false; 
    HttpResponseMessage response = await ServiceCall<LoginModel>.postData(URLPREFIX + "/authenticate", loginModel); 
    if (response.IsSuccessStatusCode) 
    { 
     loginFlag = await response.Content.ReadAsAsync<bool>(); 
    } 
    if (loginFlag) 
    { 
     return RedirectToAction("Index", "Home"); 
    } 
    else 
    { 
     return View(); 
    } 
} 

ServiceCall.cs:

public static class ServiceCall<T> 
    { 
     static HttpClient client = new HttpClient(); 
     const string HTTP_BASE = "http://localhost:13359/"; 

     public static async Task<HttpResponseMessage> postData(string Url, T data) 
     { 
      HttpResponseMessage response = null; 
      StringContent content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json"); 
      client.BaseAddress = new Uri(HTTP_BASE); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      response = await client.PostAsync(Url, content); 
      return response; 
     } 
    } 

Вот мой Скриншот:

enter image description here

Функция Войти как в WebAPI и MVC выполняется правильно, но при переходе на главную страницу, я не мог потреблять услугу. Любые советы будут полезны. Благодарю.

Update # 1:

Вот my project repo с этим вопросом. Взгляни, пожалуйста. Благодаря

ответ

0

я думаю, что проблема здесь:

HttpResponseMessage response = await ServiceCall<LoginModel>.postData(URLPREFIX + "/authenticate", loginModel); 
    if (response.IsSuccessStatusCode) 
    { 
     loginFlag = await response.Content.ReadAsAsync<bool>(); 
    } 

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

+0

Спасибо за ответ. Можете ли вы дать мне пример кода? –

+0

Я не отвечаю на ваш код клиента, и если ваше приложение webapi и mvc на другом сервере (если это правда, вы не можете использовать аутентификацию api в приложении), во многих примерах вы можете сделать это самостоятельно, вам нужно понять это, а не кто-то писать для тебя. – Bucketcode

+0

Спасибо, мой друг. Я обновил свой вопрос с помощью моей программы ServiceCall. Единственным новым запросом, который я использую, является 'static HttpClient client = new HttpClient();'. Можно ли использовать один и тот же HttpClient без создания нового? –