2016-08-02 2 views
0

Autofac을 사용하여 IdentityServer 및 OpenID Connect로 webapi를 보호하려고합니다. 나는 OWIN을 사용하고 있습니다. 그러나 어떤 이유로 나는 사용자의 주장을 얻을 수 없습니다. AccessTokenValidation이 전혀 실행되지 않는 것 같습니다. 그게 내 시작시 내 선언의 순서에 뭔가 잘못되었다고 생각하게 만든다. 여기 내 시동이있다. 내가 하이브리드 흐름과 API를 사용하고IdentityServer 및 Autofac으로 webapi 보호 - 클레임을 얻을 수 없음

public class Startup { 

    public void Configuration(IAppBuilder appBuilder) { 

     // Add authentication 
     this.AddAuthentication(appBuilder); 

     HttpConfiguration config = new HttpConfiguration(); 
     var container = CreateAutofacContainer(); 

     var resolver = new AutofacWebApiDependencyResolver(container); 
     config.DependencyResolver = resolver; 
     WebApiConfig.Register(config); 
     config.EnsureInitialized(); 

     // Register config - you can't add anything to pipeline after this 
     appBuilder.UseAutofacMiddleware(container); 
     appBuilder.UseAutofacWebApi(config); 
     appBuilder.UseWebApi(config);  
    } 

    private static IContainer CreateAutofacContainer() { 

     var autofacBuilder = new ContainerBuilder(); 

     var assembly = Assembly.GetExecutingAssembly(); 

     // Register your Web API controllers. 
     autofacBuilder.RegisterApiControllers(assembly); 

     // For general logging implementation 
     autofacBuilder.RegisterType<ConsoleLogger>().As<ILogger>(); 

     // Create empty usage context to be filled in OWIN pipeline 
     IUsageContext usageContext = new RuntimeUsageContext(); 
     autofacBuilder.RegisterInstance(usageContext).As<IUsageContext>().SingleInstance(); 

     // We need to get usage context builded 
     autofacBuilder.RegisterType<OIDCUsageContextProvider>().InstancePerRequest(); 

     var container = autofacBuilder.Build(); 
     return container; 
    } 

    private void AddAuthentication(IAppBuilder app) { 

     var options = new IdentityServerBearerTokenAuthenticationOptions(); 

     options.Authority = "MYAUTHORITY"; 
     options.RequiredScopes = new[] { "openid", "profile", "email", "api" }; 
     options.ValidationMode = ValidationMode.ValidationEndpoint; 
     app.UseIdentityServerBearerTokenAuthentication(options); 

     // Add local claims if needed 
     app.UseClaimsTransformation(incoming => { 

      // either add claims to incoming, or create new principal 
      var appPrincipal = new ClaimsPrincipal(incoming); 
      // incoming.Identities.First().AddClaim(new Claim("appSpecific", "some_value")); 

      return Task.FromResult(appPrincipal); 
     }); 
    } 

는 SPA-응용 프로그램에서 호출됩니다. 액세스 토큰이 유효하고 클레임이 있음을 확인했습니다 (신원 서버의 끝점을 직접 호출하여). 또한 IdentityServer.AccessTokenValidation 프로젝트를 다운로드하고 참조로 첨부했습니다. 해당 프로젝트의 메소드에 중단 점을 설정하면 절대로 호출되지 않습니다. 그렇기 때문에 내 시동 및 OWIN 파이프 라인에 문제가 있다고 생각합니다.

시작시에 UsageContext를 선언했습니다. 클레임 및 일부 구성 설정을 수집하는 데 사용하는 클래스입니다. 실제 컨트롤러에 주입됩니다. 나는 이것을 처리하는 것이 좋은 방법이라고 생각한다. 그래서 컨트롤러에는 항상 유효한 UsageContext가있다.

많은 샘플과 예제를 읽었지만 정확히 동일한 상황을 발견하지 못했습니다. 나는 올바른 방향으로 나를 가르키려는 시도에 감사 할 것이다.

안부, 보레

+0

전역 승인 필터를 등록 했습니까? 아니면 ApiControllers에 인증을 적용 했습니까? –

+0

나는 Authorize-attribute를 사용하려고 시도했지만 그것 없이는 전역 인증 필터를 시도하지 않았다. 컨트롤러에 전역 필터 또는 속성을 사용하여 차이가 있는지 여부를 모르겠습니다. – Borre

+0

ApiController의 Auth 특성으로 충분합니다. –

답변

1

IT는 싱글로 UsageContext의 등록 될 수 있을까요? 이 클래스에는 클레임이 포함되어 있으므로이 객체는 일단 http 요청을 받아야합니다.

+0

그것은 좋은 지적이다! UsageContext를 구현하는 코드 부분에는 결코 도달하지 않았기 때문에 여전히 원래의 문제와 관련성이 없다고 생각합니다. – Borre

1

AccessTokenValidation - 작동하지 않는 라이브러리에 신비한 줄이 있음이 드러났습니다. 나는 그 도서관을 사용하여 청구권을 얻는다. 라인을 변경 한 후 모든 것이 제대로 작동하는 것처럼 보였습니다.

기본적으로 내 질문은 이제 끝났으며 물건은 작동합니다. 그러나 나는 아직도 이것이 이것이 올바른 방법임을 확신하지는 않습니다.

의견에 감사드립니다.

관련 문제