2016-11-04 3 views
2

Я новичок в ядре .net и havent, использующем ASP, так как версия 2/3 так голая со мной.Аутентификация с использованием API .net core

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

Далее я создаю FE, чтобы снова использовать API с ядром .net. У меня есть моя форма входа и сообщение в FE, который использует RestSharp для выполнения запроса API, дающего учетные данные, полученные из формы. И я получаю некоторые Пользовательские данные и Cookie/Token Identity. Я установил cookie/token в ответ, и теперь мой FE сможет использовать это для выполнения других вызовов API с помощью ajax, например.

Но мой вопрос: откуда я знаю, что он все еще регистрируется через X минут? При вызове API будет отказано, если срок действия Cookie/токена истек, но как мой FE-BE знает, что они больше недействительны? Проверяю ли я каждый срок истечения срока действия? enter image description here

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

+0

Немного по теме: Я рекомендую 'HttpClient' над RestSharp. Он полностью построен на асинхронных вызовах с большой поддержкой модульного тестирования, в то время как RestSharp зависит от более старых «WebClient» и синхронных вызовов; по крайней мере, это делалось до недавнего времени. – thoean

+0

@thoean спасибо за отзыв, я посмотрю на HttpClient, я просто нашел RestSharp более простым в использовании. Также PostMan автоматически переводится в RestSharp :) – Drakoumel

ответ

0

Отклонения API будут лишены, если Cookie/токен истек, но как FE-BE знает, что они больше недействительны? Проверяю ли я каждый срок истечения срока действия?

Чтобы определить, истек ли срок действия несанкционированного доступа, проверьте expires_in временные рамки, которые optionally comes with an OpenID Connect implicit flow response..

  • access_token
  • token_type
  • id_token
  • state
  • expires_in ДОПОЛНИТЕЛЬНО. Срок действия токена доступа в секундах с момента создания ответа.

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

Но мой вопрос: откуда я узнаю, что он все еще регистрируется через X минут?

Чтобы определить, является ли пользователь все еще вошли в систему, используйте id_token а не access_token.

+0

thnx Я получил его сейчас, теперь я поставлю свое решение в качестве ответа, и было бы здорово, если бы вы взглянули на ответ. (надеюсь, что вы сможете быстро очистить код) – Drakoumel

0

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

 // 
    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Login(LoginViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Do a rest call to the API 
      Uri _baseUri = new Uri("http://localhost:8000/"); 
      var client = new RestClient(_baseUri + "api/Account/login"); 
      var request = new RestRequest(Method.POST); 
      request.AddHeader("postman-token", "7ee2a21b-70d5-8a68-f0dd-518b8a61ddbf"); 
      request.AddHeader("cache-control", "no-cache"); 
      request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
      request.AddParameter("application/x-www-form-urlencoded", "Email=blah%40gmail.com&password=a1Aa1Aa1A!&=", ParameterType.RequestBody); 
      IRestResponse response = client.Execute(request); 

      // Check the response 
      if (response.StatusCode == HttpStatusCode.OK) { 
       // Grab the cookie for the Identity 
       // this can be replaced by a token in the future 
       String cookie = response.Cookies.Where(c => c.Name == ".AspNetCore.Identity.Application").First().Value; 
       // Store the cookie value to use it in sub-sequent requests     
       HttpContext.Session.SetString("IdentityCookieId", cookie); 


       // Add claims to our new user, an example Name and an example Role 
       const string Issuer = "http://blah.com"; 
       var claims = new List<Claim>(); 
       claims.Add(new Claim(ClaimTypes.Name, "AnonymUser", ClaimValueTypes.String, Issuer)); 
       claims.Add(new Claim(ClaimTypes.Role, "Administrator", ClaimValueTypes.String, Issuer)); 

       var userIdentity = new ClaimsIdentity("SecuredLoggedIn"); 
       userIdentity.AddClaims(claims); 
       var userPrincipal = new ClaimsPrincipal(userIdentity); 

       // Sign in the user creating a cookie with X ammount of Expiry 
       await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, 
        new AuthenticationProperties 
        { 
         ExpiresUtc = DateTime.UtcNow.AddMinutes(1), 
         IsPersistent = false, 
         AllowRefresh = false 
        }); 

       // Move back to the ReturnUrl or for me always to the dashboard 
       return RedirectToLocal("/dashboard"); 
      } 
     } 

     return View(model); 
    } 

Ofcourse вы должны отредактировать файл Startup.cs под ConfigureServices добавить services.AddAuthorization(); до вашего AddMvc().

А под Configure добавить

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "Cookie", 
      LoginPath = new PathString("/account/login/"), 
      AccessDeniedPath = new PathString("/Account/Forbidden/"), 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true 
     }); 
+0

@ShaunLuttin посмотреть, если у вас есть время. – Drakoumel

Смежные вопросы