ASP.NET Ядро. Как я могу создать файл cookie для аутентификации без учетной записи пользователя identity?

#c# #asp.net-mvc #asp.net-core

#c# #asp.net-mvc #asp.net-core

Вопрос:

Мое приложение создает токен Guid события

Клиент посещает URL-адрес события следующим образом. https://example.com/event/a3b2e538-e87c-4444-a655-5171f263ac70

Затем клиент перенаправляется в форму входа для предоставления пароля события.

Если пароль обрабатывается, клиент токена события сможет увидеть событие. Могу ли я выполнить это без учетной записи пользователя Identity? (В данном случае я не хочу следовать классическому подходу к входу в систему с идентификацией пользователя).

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

 [HttpPost]
[Route("validate/{code}")]
public IActionResult Cookie(string code)
{
    var user = true;  //Validate event token against event password supplied by user 
    if (user == true)
    {
        var ident = _userManager.CreateAuthCookie(user, DefaultAuthenticationTypes.ApplicationCookie);

        HttpContext.GetOwinContext().Authentication.SignIn(new AuthenticationProperties { IsPersistent = false }, ident);
        
        return Redirect("Wherever");
    }
    ModelState.AddModelError("", "Invalid login attempt");
    return View();
}
  

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

1. Цель состоит в том, чтобы создать токен аутентификации, верно? либо это может быть путем проверки GUID или учетной записи пользователя identity.

2. @MiteshPrajapati На самом деле учетной записи пользователя не будет. Цель состоит в создании аутентификационного файла cookie с токеном url и паролем, предоставленным пользователем (если эта комбинация совпадает)

3. вместо настройки GUID вы можете создать токен JWT и поместить в него всю информацию. при входе в систему вместо проверки по базе данных вы можете выполнить проверку по токену JWT и создать фактический токен аутентификации, если все будет проверено.

4. Я очень надеюсь, что вы не отправляете пароль в виде обычного текста code

Ответ №1:

Думаю, я понимаю вашу точку зрения. Вы хотите создать пользовательскую среду аутентификации Owin. То же самое может быть достигнуто с помощью токена JWT. Он имеет преимущества перед аутентификацией OWIN.

Но если вы хотите создать что-то подобное с помощью OWIN, пожалуйста, позаботьтесь об этом:

  • Первое и самое главное, параметр, передаваемый в URL, не должен иметь никакого пароля или конфиденциального значения. Токен URL должен быть закодирован (для кодирования вы можете ссылаться https://www.nuget.org/packages/Microsoft.Owin.Security /) и этот закодированный токен может нести эту информацию. Во время кодирования вы можете закодировать someID (не адрес электронной почты), некоторый sourcecd (который сообщает, что токен получен из действительного источника), некоторое ограничение по времени и сколько раз этот токен будет действительным.

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

Важно: алгоритм кодирования и декодирования играет здесь очень важную роль. Итак, ваш токен кодирования и декодирования нигде не должен отображаться.

Если он является действительным пользователем, затем создайте объект ClaimsIdentity .

 ClaimsIdentity identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, identity.FindFirst("sub").Value));
identity.AddClaim(new Claim("Name", <<add your claims like this>>));
identity = new ClaimsIdentity(identity.Claims, "ApplicationCookie");

AuthenticationProperties properties = new AuthenticationProperties();
AuthenticationManager.SignIn(properties, identity);
  

Настройте объект класса аутентификации в вашем контроллере или в отдельный файл:

 using Microsoft.Owin.Security;

        private IAuthenticationManager authenticationManager;
        public IAuthenticationManager AuthenticationManager
        {
            get
            {
                if (authenticationManager == null)
                    authenticationManager = HttpContext.GetOwinContext().Authentication;
                return authenticationManager;
            }
            set { authenticationManager = value; }
        }
  

У вас также должен быть настроен уровень OWIN на промежуточном уровне. Вы можете настроить средний уровень OWIN на основе .Net framework или .Net Core