2017-11-30 8 views
1

에서 나는 모든 컨트롤러 액션에 대한 인증 변수를 설정해야합니다 기본 컨트롤러를 가지고 싶습니다읽기 ControllerBase.User는 생성자

_claimsIdentity = User.Identity as ClaimsIdentity; 
_userId = claimsIdentity.FindFirst("ID")?.Value; 

불행하게도 ControllerBase.User 생성자의 null을 더 초기화 방법에 없다 ControllerBase가 here으로 다시 정의됩니다. 어떻게이 값들이 모든 동작에 대해 이미 설정된 기본 컨트롤러를 만들 수 있습니까?

답변

3

User 속성이 설정되기 전에 컨트롤러가 파이프 라인에서 먼저 초기화됩니다. 즉, 생성자에서 액세스하려고하면 null이됩니다.

액션이 호출 될 때까지 프레임 워크는 이미 요청에서 추출한 필수 값을 할당했을 것입니다. 따라서 액션 내에서 User 속성에 액세스하는 것이 좋습니다.

기본 컨트롤러 생성자에서 필드를 설정하는 대신 속성을 사용하여 원하는 것을 얻을 수 있습니다. 예 :

protected ClaimsIdentity ClaimsIdentity => User.Identity as ClaimsIdentity; 
protected string UserId => ClaimsIdentity.FindFirst("ID")?.Value; 

파생 된 하위 클래스의 동작 내에서 액세스하십시오.

아이 클래스는 다른 모르는 것 - 유일한 차이점은 명명 규칙 특성에 차이가 있지만이 정말 전복 당신이, 당신이 항상 같은 이름을 사용할 수 있다면 당신은 전에 있었다.

+0

또 다른 중요한 차이점은 아마도이 접근법으로'UserId' 속성에 액세스 할 때마다'FindFirst()'가 호출 될 것입니다. – CalC

+1

@CalC 그래,하지만 당신의 행동 중 수천 번의 반복을 위해 공격적이고 빡빡한 루프로이 건물을 치는 것이 주목할만한 차이 일뿐입니다. –