사용자가 올바른 자격 증명을 두 번 입력해야하는 이유는 무엇입니까?

캐스터 트로이
public ActionResult Login(CredentialsModel model)
{
    authenticator.Authenticate(model.Username, model.Password);

    if (authenticator.Authenticated)
    {
        return Redirect();
    }
}

...

public class Authenticator : IAuthenticator
{
    public bool Authenticated
    {
        get { return HttpContext.Current.User.Identity.IsAuthenticated; }
    }

    public void Authenticate(string username, string password)
    {
        var authenticated = FormsAuthentication.Authenticate(username, password);
        if (authenticated)
            FormsAuthentication.SetAuthCookie(username, false);
    }

    public void Logout()
    {
       FormsAuthentication.SignOut();
    }
}

앞서 언급 한 작업 메서드가 메서드에 유효한 자격 증명을 제공 Authenticate하면 Authenticated속성은 분명히 잘못된 false를 반환합니다.

작업 메서드가 두 번째로 일부 자격 증명을 제공 하면 Authenticated속성이 true를 반환합니다.

컨텍스트가 즉시 업데이트되지 않는다는 사실과 관련이 있다고 생각합니다. 실제로 FormsAuthentication.Authenticate액션 메서드에서의 즉각적인 반환 값을 사용하여이 버그를 해결 했지만 이 버그가 발생하는 이유 를 알고 싶습니다 .

아드리아노 레 페티

HTTP 컨텍스트에서 첫 번째 호출과 함께 전송 된 사용자는 인증 되지 않았기 때문입니다 (그러나 후속 호출에서는 그 이후에 올 것입니다). 이 줄 뒤 :

var authenticated = FormsAuthentication.Authenticate(username, password);

당신은 그것을 볼 수 있습니다 authenticated != Authenticated. 왜? 에서 MSDN :

[HttpContext] 개별 HTTP 요청에 대한 모든 HTTP 관련 정보를 캡슐화합니다.

이는 응답 이나 미래 상태 (출력)가 아닌 요청 (입력) 따라 작동 함을 의미합니다 . 컨트롤러의 메서드 내에서 수행 하면 여전히 .SignOut()HttpContext.Current.User.Identity.IsAuthenticatedtrue

할 수있는 일은 다음에 대한 부울 반환 값을 추가하는 것입니다 Authenticate().

public bool Authenticate(string username, string password)
{
    var authenticated = FormsAuthentication.Authenticate(username, password);
    if (authenticated)
        FormsAuthentication.SetAuthCookie(username, false);

    return authenticated:
}

컨트롤러의 코드를 다음과 같이 변경합니다.

if (authenticator.Authenticate(model.Username, model.Password))
{
    return Redirect();
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

사용자가 올바른 자격 증명을 두 번 입력해야하는 이유는 무엇입니까?

분류에서Dev

아이콘을 두 번 클릭 할 때 사용자에게 실행 자격 증명을 묻는 메시지를 표시하는 방법은 무엇입니까?

분류에서Dev

두 개의 피연산자가있는 명령문이 올바른 출력을 위해 하나의 피연산자가있는 명령문 위에 있어야하는 이유는 무엇입니까?

분류에서Dev

Arduino IDE / ESP8266 : 올바른 출력을 얻기 위해 버튼을 두 번 눌러야하는 이유는 무엇입니까?

분류에서Dev

사용자가 첫 번째 명령을 입력 한 후이 메시지가 두 번 인쇄되는 이유는 무엇입니까?

분류에서Dev

이 파이썬 이해가 사용자 입력을 여러 번 반복하는 이유는 무엇입니까?

분류에서Dev

기본 프록시 자격 증명을 사용하면 407 응답 후 자동 두 번째 http 요청이 발생하지 않는 이유는 무엇입니까?

분류에서Dev

AWS SDK Go를 사용하여 Fargate 작업의 역할에서 AWS 자격 증명을로드하는 올바른 방법은 무엇입니까?

분류에서Dev

올바른 위치에 올바른 문자열을 추가하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 자격 증명을 입력하면 시작 페이지를 표시 하시겠습니까?

분류에서Dev

입력하는 각 문자열에 대해 Enter 키를 두 번 눌러야하는 이유는 무엇입니까?

분류에서Dev

If, then ... fi 명령을 사용하여 사용자가 올바른 파일 형식을 입력했는지 확인하는 방법은 무엇입니까?

분류에서Dev

이 컨트롤 템플릿을 사용하여 텍스트 상자로 이동하려면 탭을 두 번 눌러야하는 이유는 무엇입니까?

분류에서Dev

MVC Entity Code-First Approach에서 입력 한 이전 비밀번호 사용자가 올바른지 확인하는 방법은 무엇입니까?

분류에서Dev

자바 스크립트가 두 번 이상 작동하지 않는 이유는 무엇입니까?

분류에서Dev

mount 명령을 사용하여 삼바 공유를 마운트 할 때 자격 증명 파일을 사용하는 방법은 무엇입니까?

분류에서Dev

테이블을 두 번 조인해야 할 때 SQL에서 내부 조인을 올바르게 사용하는 방법은 무엇입니까?

분류에서Dev

테이블을 두 번 조인해야 할 때 SQL에서 내부 조인을 올바르게 사용하는 방법은 무엇입니까?

분류에서Dev

Gmail 자격 증명을 입력으로 사용하여 PHP에서 사용자의 이름을 가져 오는 방법은 무엇입니까?

분류에서Dev

첫 번째 값이없는 경우 두 번째 및 세 번째 분할 값을 사용하는 방법은 무엇입니까? (자바)

분류에서Dev

사용자 정의 유형에 대해 UnmarshalJSON을 선언하는 올바른 방법은 무엇입니까?

분류에서Dev

사용자 입력을 확인하는 올바른 방법은 무엇입니까?

분류에서Dev

웹 서비스 참조에 사용자 지정 보안 바인딩 자격 증명을 추가하는 방법은 무엇입니까?

분류에서Dev

기성 자격 증명을 사용할 수없는 이유는 무엇입니까?

분류에서Dev

snprintf가 두 번째 문자열을 변경하는 이유는 무엇입니까?

분류에서Dev

loginctl 동일한 사용자가 두 번 연결됨 : 올바른 세션을 종료하는 방법?

분류에서Dev

내 onClickListener가 두 번 클릭해야하는 이유는 무엇입니까?

분류에서Dev

systemd를 사용하여 암호를 한 번만 입력하여 두 개의 LUKS 장치에 걸쳐있는 루트 파일 시스템의 잠금을 해제하는 올바른 방법은 무엇입니까?

분류에서Dev

Chrome / Firefox가 올바른 문자 인코딩을 선택하지 못하는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    사용자가 올바른 자격 증명을 두 번 입력해야하는 이유는 무엇입니까?

  2. 2

    아이콘을 두 번 클릭 할 때 사용자에게 실행 자격 증명을 묻는 메시지를 표시하는 방법은 무엇입니까?

  3. 3

    두 개의 피연산자가있는 명령문이 올바른 출력을 위해 하나의 피연산자가있는 명령문 위에 있어야하는 이유는 무엇입니까?

  4. 4

    Arduino IDE / ESP8266 : 올바른 출력을 얻기 위해 버튼을 두 번 눌러야하는 이유는 무엇입니까?

  5. 5

    사용자가 첫 번째 명령을 입력 한 후이 메시지가 두 번 인쇄되는 이유는 무엇입니까?

  6. 6

    이 파이썬 이해가 사용자 입력을 여러 번 반복하는 이유는 무엇입니까?

  7. 7

    기본 프록시 자격 증명을 사용하면 407 응답 후 자동 두 번째 http 요청이 발생하지 않는 이유는 무엇입니까?

  8. 8

    AWS SDK Go를 사용하여 Fargate 작업의 역할에서 AWS 자격 증명을로드하는 올바른 방법은 무엇입니까?

  9. 9

    올바른 위치에 올바른 문자열을 추가하지 않는 이유는 무엇입니까?

  10. 10

    올바른 자격 증명을 입력하면 시작 페이지를 표시 하시겠습니까?

  11. 11

    입력하는 각 문자열에 대해 Enter 키를 두 번 눌러야하는 이유는 무엇입니까?

  12. 12

    If, then ... fi 명령을 사용하여 사용자가 올바른 파일 형식을 입력했는지 확인하는 방법은 무엇입니까?

  13. 13

    이 컨트롤 템플릿을 사용하여 텍스트 상자로 이동하려면 탭을 두 번 눌러야하는 이유는 무엇입니까?

  14. 14

    MVC Entity Code-First Approach에서 입력 한 이전 비밀번호 사용자가 올바른지 확인하는 방법은 무엇입니까?

  15. 15

    자바 스크립트가 두 번 이상 작동하지 않는 이유는 무엇입니까?

  16. 16

    mount 명령을 사용하여 삼바 공유를 마운트 할 때 자격 증명 파일을 사용하는 방법은 무엇입니까?

  17. 17

    테이블을 두 번 조인해야 할 때 SQL에서 내부 조인을 올바르게 사용하는 방법은 무엇입니까?

  18. 18

    테이블을 두 번 조인해야 할 때 SQL에서 내부 조인을 올바르게 사용하는 방법은 무엇입니까?

  19. 19

    Gmail 자격 증명을 입력으로 사용하여 PHP에서 사용자의 이름을 가져 오는 방법은 무엇입니까?

  20. 20

    첫 번째 값이없는 경우 두 번째 및 세 번째 분할 값을 사용하는 방법은 무엇입니까? (자바)

  21. 21

    사용자 정의 유형에 대해 UnmarshalJSON을 선언하는 올바른 방법은 무엇입니까?

  22. 22

    사용자 입력을 확인하는 올바른 방법은 무엇입니까?

  23. 23

    웹 서비스 참조에 사용자 지정 보안 바인딩 자격 증명을 추가하는 방법은 무엇입니까?

  24. 24

    기성 자격 증명을 사용할 수없는 이유는 무엇입니까?

  25. 25

    snprintf가 두 번째 문자열을 변경하는 이유는 무엇입니까?

  26. 26

    loginctl 동일한 사용자가 두 번 연결됨 : 올바른 세션을 종료하는 방법?

  27. 27

    내 onClickListener가 두 번 클릭해야하는 이유는 무엇입니까?

  28. 28

    systemd를 사용하여 암호를 한 번만 입력하여 두 개의 LUKS 장치에 걸쳐있는 루트 파일 시스템의 잠금을 해제하는 올바른 방법은 무엇입니까?

  29. 29

    Chrome / Firefox가 올바른 문자 인코딩을 선택하지 못하는 이유는 무엇입니까?

뜨겁다태그

보관