2017-01-16 1 views
0

OAuthAuthorizationServerProvider을 구현했습니다. 나는 OAuthAuthorizationServerProvider의 구현에 IOAuthService (인증을위한 나의 서비스)을 주입한다. IOAuthService를 구현하면 생성자의 매개 변수를 통해 DbContext가 제공됩니다. 따라서 OAuthAuthorizationServerProvider는 DbContext를 싱글 톤으로 제공합니다.dbconext를 owin middleware에 삽입합니다.

내 구현에 DbContext을 삽입하려면 OAuthAuthorizationServerProvider 웹 요청 범위 당 Autofac을 사용 하시겠습니까?

나는 다음과 같은 코드를 사용하여 dbcontext을 등록하려고하면 :

builder.RegisterType<OAuthProviderContext>().As<DbContext>().InstancePerWebRequest(); 

그때 나는 오류가 발생합니다 : 새로운 범위는 HttpRequest에와 연관 할 수 없습니다.

public class ADAuthorizationServerProvider : OAuthAuthorizationServerProvider 
    { 
     private readonly IAppSettings _appSettingsProvider; 
     private readonly IOAuthServiceProvider _oauthServiceProvider; 

    public ADAuthorizationServerProvider(IAppSettings appSettingsProvider, 
     IOAuthServiceProvider oauthServiceProvider) 
    { 
     _appSettingsProvider = appSettingsProvider; 
     _oauthServiceProvider = oauthServiceProvider; 
    } 

    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     //code 
    } 

public class OAuthServiceProvider : IOAuthServiceProvider 
    { 
     private readonly IRefreshTokenRepository _refreshTokenRepository; 
     private readonly IClientRepository _clientRepository; 
     private readonly IUserRepository _userRepository; 
     private readonly IUnitOfWork _unitOfWork; 



    public OAuthServiceProvider(IRefreshTokenRepository refreshTokenRepository, 
     IClientRepository clientRepository, 
     IUserRepository userRepository, 
     IUnitOfWork unitOfWork) 
    { 
     _refreshTokenRepository = refreshTokenRepository; 
     _clientRepository = clientRepository; 
     _userRepository = userRepository; 
     _unitOfWork = unitOfWork;    
    } 

    public async Task AddRefreshToken(RefreshToken token) 
    { 
     //code...    
    } 

    public async Task DeleteRefreshToken(string tokenId) 
    { 
     //code... 
    } 

    public async Task<Client> FindClient(string clientName) 
    { 
    //code... 
    } 

    public async Task<RefreshToken> FindRefreshToken(string tokenId) 
    { 
     //code... 
    } 

    public async Task<User> FindUser(string username) 
    { 
    //code... 
    } 
} 

public class ClientRepository : BaseReadonlyRepository<Guid, Client>,  IClientRepository 
{ 
    public ClientRepository(DbContext dbContext) : base(dbContext) 
    { 
    } 

    public async Task<Client> GetByName(string name) 
    { 
     //code... 
    } 
} 

public class RefreshTokenRepository : BaseRepository<string, RefreshToken>, IRefreshTokenRepository 
{ 
    public RefreshTokenRepository(DbContext dbContext) : base(dbContext) 
    { 
    } 
} 

public class UserRepository : BaseReadonlyRepository<Guid, User>, IUserRepository 
{ 
    public UserRepository(DbContext dbContext) : base(dbContext) 
    { 
    } 

    public async Task<User> GetByName(string username) 
    { 
     //code... 
    } 
} 

builder.RegisterType<OAuthProvider>().As<DbContext>().InstancePerLifetimeScope() //I give DbContext as singleton here. 

`

+0

관련 코드를 넣을 수 있습니까? – Wellspring

+1

그리고 제대로 포맷하십시오 ... –

+0

스택 추적? 전체 예외? 또한, 질문은 당신이'InstancePerWebRequest'을 사용하고 있다고 말하고 있지만 코드는'InstancePerLifetimeScope'라고합니다 - 그것입니까? –

답변

0

당신은 OAuthAuthroizationServerMiddleware을 바꿈됩니다 Autofac에서 제공하는 기능을 사용할 수 있습니다. 그렇게하면 OAuth 미들웨어와 모든 의존성이 각 요청에 대해 Autofac에 의해 인스턴스화되므로 아무런 싱글 톤도 포함되지 않습니다.

relevant documentation을 읽고, 샘플을 this GitHub repository에 넣어주십시오.

+0

샘플을 보내 주셔서 감사합니다! –