2014-11-12 2 views
0

클래스 사이의 토큰을 공유 할 수어떻게 asp.net 웹-API를 설계 문제가 발생하고이 문제를 해결하는 방법을 알고 싶습니다

public abstract class BaseApiController<TEntity> : ApiController where TEntity : Entity 
{ 

    protected string GetUsername() 
    { 
     return Utilities.GetUsername(Request.Headers.Authorization); 
    } 

    //some other code 

} 

public class StakeholderApiController : BaseApiController<Stakeholders> 
{ 
     ILogger _logger = new CustomApiLogger("StkhManager", GetUsername()) 

    //some other code 

} 

지금 내가 가지고있는 문제는 다음과 같습니다

모든 ApiControllers간에 특정 기능을 공유하는 BaseApiController가 있습니다.

그리고 나서 공유 기능이없는 특정 ApiController가 있습니다.

이제 로깅을하는 동안 로그인 한 사용자 이름을 기록하고 싶습니다. 문제는 새 인스턴스를 만들 때마다 전달해야합니다. 로그인 한 사용자의 이름을 전역으로 만들 수있는 방법이 있습니까? 현재 api 요청을 통해 모든 곳에서 액세스 할 수 있습니다.

정적으로 만들 수는 없습니다. 그렇지 않으면 다른 사용자가 잘못된 사용자 이름을 요청할 수 있습니다.

내가 매번 전달하는 것을 피할 수있는 방법이 있습니다. webapi가 무국적이므로 세션을 사용할 수 없으므로 다른 방법이 있습니까 ??

나는 그래서 내가 MVC에서 제공하는 인증 기술을 사용하고 있지 않다, AngularJS와 프론트 엔드를 사용하고/.NET

참고 :

  1. 내가 어떤 이유로 기본 클래스에 로거의 생성을 이동할 수 없습니다

  2. 이것은 하나의 예이며 다른 많은 곳에서 로그인 한 사용자의 이름을 사용하고 싶습니다. 그러므로 주위를 지나치고 싶지 않습니다.

+0

'Thread.CurrentPrincipal.Identity.Name'을 사용해 보셨나요? – haim770

+0

나는 클라이언트 측에서 angularjs를 사용하고 있으므로 현재로서는 CurrentPrincipal과 관련된 아무 것도 설정하지 않습니다. 하지만 당신이 어떻게 내가 그것을 설정할 수있는 코드를 공유 할 수 있다면 그것은 좋을 것입니다 ... – harishr

답변

1

ASP.NET 웹 API를 사용하여 주체를 설정하고 액세스하는 데 표준 패턴이 있습니다. BaseApiController과 같은 ApiController에서 User 속성을 사용하면 검색 할 수 있습니다. 이를 설정하려면 일반적으로 요청 개체에서 HttpRequestContext을 가져오고 주체는 이와 같이 설정됩니다.

Request.GetRequestContext().Principal = new ClaimsPrincipal(...);

BTW, 당신은 거의 어디서나 웹 API 파이프 라인에 현재 요청 개체에 액세스 할 수 있습니다.

+0

하지만 BaseApiController에서 Principal을 어디에서 초기화해야합니까 ?? 또는 로그인? – harishr

+0

인증 후에 프린시 펄을 설정해야합니다. – Badri

관련 문제