Ошибка аутентификации MVC Web Api

#asp.net-mvc #cookies #asp.net-web-api2 #.net-core

#asp.net-mvc #файлы cookie #asp.net-web-api2 #.net-ядро

Вопрос:

У меня есть два приложения MVC, MVC web и MVC web api. Приложение MVC запущено под «http://localhost:8241 /» и веб-api MVC работает под управлением «http://localhost:8243 /«. Я настроил аутентификацию cookie в приложении MVC. вот код в startup.cs

  app.UseCookieAuthentication(options =>
        {

            options.AutomaticAuthenticate = true;
            options.AutomaticChallenge = true;
            options.AuthenticationScheme = "CookieAuthHRMS";
            options.CookieName = "access_token";

            options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
            options.SlidingExpiration = true;

            options.LoginPath = new Microsoft.AspNet.Http.PathString("/Account/Login");
            options.LogoutPath = new Microsoft.AspNet.Http.PathString("/Account/Logout");
            options.AccessDeniedPath = new Microsoft.AspNet.Http.PathString("/Account/AccessDenied");

        });
  

Он работает нормально. Я могу увидеть файл cookie access_token с помощью инструмента разработчика Chrome. Итак, я хочу добавить аутентификацию в свой проект web api. Итак, я сделал точно такой же код в Startup.cs проекта web api. создайте контроллер с именем conjunctioncontroller для аутентификации веб-api. вот код:

  [HttpPost("ConjunctionLI/{username}/{password}")]
    public async Task<bool> ConjunctionLI(string username, string password)
    {

        UsersEntity usrEty = await _usr.findsUsers(username, password);

        if (usrEty != null)
        {
            List<Claim> userClaims = new List<Claim>
            {
                new Claim("userId",usrEty.UserId.ToString()),
                new Claim("EmployeeId",usrEty.EmployeeID),
                new Claim(ClaimTypes.Name, usrEty.UserName),
            };

            ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "local"));

            await HttpContext.Authentication.SignInAsync("CookieAuthHRMS", principal);
        }            

        return true;    
    }
  

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

  [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(LoginViewModel lgvm)
    {
        if (ModelState.IsValid)
        {
            var user = await _userManager.FindAsync(lgvm.UserName, lgvm.Password);
            string resu<
            if(user!= null)
            {
                //call api service

                using (var client = new HttpClient())
                {

                    string apiSec = @"http://localhost:8243/api/Conjunction/ConjunctionLI/"   lgvm.UserName   "//"   lgvm.Password;

                    HttpResponseMessage response = await client.PostAsync(apiSec, null);
                    response.EnsureSuccessStatusCode();
                    result = await response.Content.ReadAsStringAsync();
                }

                await SignInAsync(user, lgvm.RememberMe);
                return RedirectToAction("Index", "Home");
            }
        }

        return RedirectToAction("AccessDenied","Account");
    }
  

Я поместил тег [Authorize] в один из контроллеров веб-api, но все равно не удалось. Несмотря на то, что я использовал » await HttpContext.Проверка подлинности.SignInAsync («CookieAuthHRMS», принципал); «как и в веб-приложении MVC, проверка подлинности по-прежнему не выполняется.

Есть ли какой-нибудь правильный способ сделать это? Как я могу аутентифицировать проект веб-api?

Лучшие Rgd, frog

Комментарии:

1. Токен доступа не может работать на двух сайтах с разными номерами портов. Какой именно код ошибки вы получаете?

2. нет ошибки, просто не работает

3. Несмотря на то, что я выполняю вход, он все еще не авторизован.

4. Используйте один и тот же machineKey в обоих файлах web.config приложения.

5. У меня нет файла web.config, потому что я использую .net core. как мне это сделать?

Ответ №1:

Это выполняется путем добавления промежуточного программного обеспечения для защиты данных в Startup.cs.

  public void ConfigureServices(IServiceCollection services)
    {

        services.AddCors(Configure);                      

        services.AddMvc();                                    

        services.AddDataProtection();

        services.ConfigureDataProtection(configure => {

            configure.SetApplicationName("HRMS");
            configure.PersistKeysToFileSystem(new DirectoryInfo(@"C:shared-auth-ticket-keys"));               
        });

    }