2016-07-06 3 views
1

ServiceStack 서버가 ASP.NET의 인증 쿠키 만 사용할 수있는 솔루션을 설계하려고합니다. (실제로는 어떤 쿠키라도 될 수 있습니다. 백 채널을 사용하여 세부 정보를 조회 할 수있는 세션 ID를 얻는 것입니다.) 사용자 지정 인증 공급자는 자격 증명을 기반으로하므로 올바른 방향으로 보이지 않습니다. 대신 GlobalRequestFilter가 나에게 더 의미가있었습니다. 여기서 쿠키를 확인하고 외부 세션 정보를 가져온 다음 ServiceStack 세션에 설정하고 IsAuthenticated를 설정합니다. 요구되는 세션 세부 정보에 대한 액세스 권한이 있으므로 요청 서비스에서 정상적으로 작동합니다. 지금까지 괜찮아.사용자 지정 세션이 인증과 작동하지 않습니다.

Authenticate 특성으로 서비스를 잠그기로 결정하면 내 필터보다 먼저 특성을 실행하여 항상 로그인하도록 리디렉션하려고하므로 문제가 발생합니다. 내 논리를 추가하여 인증 속성 전에 실행하고 올바르게 검증하도록 권장 장소는 무엇입니까?

+0

단지 발견 및 변경 :

public class MyAuthProvider : AuthProvider, IAuthWithRequest { public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null) { return session.IsAuthenticated; } public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request) { throw new NotImplementedException("Authenticate() should not be called directly"); } public void PreAuthenticate(IRequest req, IResponse res) { //Do any Auth validation... //populate the Session in the Request to Authenticate this user req.Items[Keywords.Session] = new AuthUserSession { UserName = ..., Email = ..., //populate other fields IsAuthenticated = true, }; } } 

그런 다음 인증 공급자 예를 들어, AppHost.Configure()AuthFeature 플러그인에 추가 사용자 정의를 등록하려면 : 여기 당신이 세션은 사용자가 인증 된 경우 사용자, 예를 채울 수 있습니다 GlobalRequestFilters에서 PreRequestField에 이르기까지 아무런 도움이되지 않습니다. Authenticate 속성을 볼 때 여전히 401을 수행하고 있습니다 –

+0

나는 그것을 얻었습니다. 세션이 Authenticate 특성을 만족하는지 확인하는 실제 방법은 세션의 IsAuthorized 메서드를 재정의하는 것입니다 (강력한 형식의 AuthUserSession을 만들어야하며) 어떤 공급자가 요청하는지에 따라 true를 반환해야합니다. public override bool IsAuthorized (문자열 공급자) { return base.IsAuthorized (provider); }' –

답변

2

ServiceStack의 [Autenticate] 속성은 ServiceStack's AuthProvider model과 함께 사용하기 때문에 여전히 사용자 지정 AuthProvider를 사용하려고합니다.

: 다음을 사용하여 자격 증명을 기반으로하지 않는 사용자 정의 인증 공급자를 만드는 예제의 마지막 릴리스 노트에서 IAuthWithRequest Auth Providers에 모습을 가질 수 AuthProvider에 IAuthWithRequest 인터페이스를 구현하면 [Authenticate] 요청 필터는 PreAuthenticate()을 호출하여 인증 확인을 수행 한 다음 t 그는 사용자가 인증되었는지 여부를 결정합니다.

Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
    new IAuthProvider[] { 
    new MyAuthProvider(), 
    })); 
+1

고마워요! 나는 위에서 언급 한 AuthUserSession에 IsAuthorized 오버라이드가 여전히 필요한 것 같지만, 나머지는 여기에있다. –

관련 문제