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.
`
관련 코드를 넣을 수 있습니까? – Wellspring
그리고 제대로 포맷하십시오 ... –
스택 추적? 전체 예외? 또한, 질문은 당신이'InstancePerWebRequest'을 사용하고 있다고 말하고 있지만 코드는'InstancePerLifetimeScope'라고합니다 - 그것입니까? –