프로젝트에 Asp.Net WebAPI를 사용하고 있습니다. 저는 현재 인증 및 권한 부여 작업을하고 있습니다.DeletingHandler에서 ApiController 유형에 액세스
요청의 HTTP 인증 헤더를 확인하고 내 ID 및 사용자 프로필을 작성하는 messageHandler가 있습니다. 그러나 컨트롤러 액션 (또는 컨트롤러 만)에 액션이 요구할 수있는 클레임을 추가하고 싶습니다. (사용자가 가질 수있는 많은 주장을 가지고 있기 때문에로드하고 싶지 않습니다.)
예컨대 : 내가 속성을보고 다시 DB에서 필요한 경우에만 내용에 따라 주장을 가져올 수 있도록하려면 인증 메시지 핸들러 내부
public class MyController : ApiController
{
[LoadClaims("SomeClaim", "SomeOtherClaim", "etc")]
public string Get()
{
if (HasClaim("SomeClaim"))
return "Awesome";
return "Bummer";
}
}
. 이를 위해 나는 루트를 기반으로 컨트롤러와 액션이 무엇을하는지 알아야합니다.
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
...
var routeData = request.GetRouteData();
object controllerName;
object actionName;
routeData.Values.TryGetValue("controller", out controllerName);
...
그래서 알 수 있습니다. 하지만 지금은이를 반영 할 수있는 Type으로 바꾸어야합니다.하지만 컨트롤러 이름 (전체 클래스 이름 또는 네임 스페이스조차도 아님) 만 있으면됩니다. 어떻게 이것을 속성 등을 얻기 위해 반영 할 수있는 것으로 변환 할 수 있습니까?
WebAPI 스택이 어떻게 수행되는지 보려면 DefaultHttpControllerSelector
을보고 있는데 HttpControllerTypeCache
을 사용하는 것으로 보입니다. 이것은 내부 클래스이므로 인스턴스를 만들 수 없습니다. 목표 컨트롤러 유형을 얻는 올바른 방법은 무엇입니까?
+1. 사용자 정의 인증 필터는 컨트롤러에 대해 필요한 모든 정보가 포함 된 작업 컨텍스트에서 최상의 접근 방식처럼 보입니다. – Despertar
좋습니다. 승인 필터로 사용하지 않은 이유는 액션 메서드에서 사용하기 위해 클레임을 미리로드하고,이를 기반으로하는 인증을 미리로드하려고하기 때문입니다. 그러나 당신은 좋은 점을 제기합니다 - 제가 액션 필터에 똑같은 것을 구현할 수 있다면 왜이 모든 일을 할 수 있습니까? –
사실, 단순한 액션 필터 OnExecuting을 사용하여 정직하게 될 수 있습니다. 사용자는 잠재적으로 얼마나 많은 클레임을 제기합니까? 나는 지금까지 관계없이 모든 것을로드하라는 충고에 저항했습니다 ... 클레임이 포함 된 세션 토큰을 사용하는 경우 각 요청에 대해 주체 및 클레임을 수화하기 위해 데이터베이스를 치는 것을 피할 수 있지만 DB 매번 단순히 성능 튜닝을하는 것이 최선의 방법 일 때마다 서버 캐시 또는 분산 메모리 캐시를 사용하여 성능을 향상시킬 수 있습니다. –