2016-09-07 7 views
1

"개별 사용자 계정"으로 기본 ASP.NET 코어를 만든 후 로그인 동작에서 User 개체의 "id"값을 얻으려고하고 있으며 항상 null을 반환합니다. 라인은 (VAR objUser = User.Claims.FirstOrDefault()를 값입니다.)입니다 홈/인덱스와 같은 다른 작업에서 액세스 할 때User.Claims.FirstOrDefault(). 로그인 작업 (ASP.NET ID 3)에서 값이 null입니까?

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 
    { 
     ViewData["ReturnUrl"] = returnUrl; 
     if (ModelState.IsValid) 
     { 
      // This doesn't count login failures towards account lockout 
      // To enable password failures to trigger account lockout, set lockoutOnFailure: true 
      var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 


      if (result.Succeeded) 
      { 

       var objUser = User.Claims.FirstOrDefault().Value; 

       _logger.LogInformation(1, "User logged in."); 
       return RedirectToLocal(returnUrl); 
      } 
      if (result.RequiresTwoFactor) 
      { 
       return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      } 
      if (result.IsLockedOut) 
      { 
       _logger.LogWarning(2, "User account locked out."); 
       return View("Lockout"); 
      } 
      else 
      { 
       ModelState.AddModelError(string.Empty, "Invalid login attempt."); 
       return View(model); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

사용자 개체가

public IActionResult Index() 
    { 
     var x = User.Claims.FirstOrDefault().Value; 
     return View(); 
    } 

거기가 null는 아니고, 결과 후 Login Action에서 User 객체를 가지는 방법 .Succeeded?

덕분에, AG

+1

왜 FirstOrDefault()의'.Value'를 사용하고 있습니까? 오류/예외가 있습니까? 확실히 당신은'var x = User.Claims.FirstOrDefault(); '할 수 있습니다.'FirstOrDefault()'메소드는 객체를 찾으면 객체를 반환하고 그렇지 않으면'null'을 반환합니다. 그렇다면'null' 체크 만하면됩니다 :'if (x! = null) {...}'. –

+1

또는 한 줄에'x'를 지정하려면 C# 6.0에서 null 전파를 사용할 수 있습니다.'var x = User.Claims.FirstOrDefault() ?. Value;' –

+0

'User'는 로그인 동작시 항상 null입니다. 다른 작업에서는 null이 아닙니다. – AG70

답변

2

나는 여기에 문제는 시간에 claimsprincipal에서 사용자가 로그인이 생성되는 것을 생각하고 쿠키 인증 미들웨어는 응답에 추가 인증 쿠키로 직렬화 그래서 응답의 일부로 브라우저에 전송됩니다.

쿠키의 메커니즘으로 인해 브라우저가 서버로 다시 전달할 때 다음 요청이있을 때까지 쿠키를 읽을 수 없습니다. 이것은 응답에 쿠키를 설정하여 쿠키를 웹 브라우저로 다시 전달하고 요청에서 웹 브라우저가 쿠키를 서버로 전달할 때 쿠키를 읽었 기 때문입니다. 게시물에 로그인 할 때 아직받지 못했기 때문에 브라우저가 인증 쿠키를 전달하지 않았습니다. 응답에 설정했지만 서버 코드에서 액세스하기 위해 언급 한대로 응답이 아닌 요청에서 온 것입니다.

다음 요청에서 쿠키가 헤더로 전달되고 쿠키 인증 미들웨어는 쿠키에서이를 역 직렬화하여 컨트롤러의 코드에있는 "사용자"의 ClaimsPrincipal으로 되돌릴 수 있습니다. 따라서 채워진 사용자 및 클레임은 다음 요청이있을 때까지 사용할 수 없으며 요청하지 않은 요청에서 가져올 수 있습니다.

예를 들어 로그인 중에 할당 된 소유권 주장을 기반으로 리디렉션 할 위치를 선택해야하는 경우 새 요청이므로 requestsprincipal에 대한 액세스 권한이있는 다른 작업으로 리디렉션하는 것이 좋습니다 이 쿠키는 쿠키에서 직렬화가 해제 된 다음 소유권 주장을 기반으로 다시 리디렉션 될 수 있습니다. 단점은 이중 방향 전환입니다.

당신이 필요로하는 것을 제공하지만 사용자가 ApplicationUser 또는 사용자 클래스를 나타내는 클래스를 가져오고 있다면 ClaimsPrincipal과 다른 사용자를 표시 할 수도 있습니다.

+0

Nice Assay :-) Joe –

0

나는 것은 내가 대답을 발견했다.

var u = await _userManager.FindByEmailAsync(model.Email); 
var u_Id = u.Id; 

감사합니다, AG