Новое для инъекций зависимостей, поэтому это, вероятно, простое дело, но я пробовал и не могу понять, что я использую Simple Injector.
У меня есть WebApi, который отлично использует SimpleInjector, теперь я хотел бы реализовать безопасность с помощью OAuth.
Для этого я начал следовать этому руководству, что очень полезно, но не использует Injection Dependancy
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
У меня есть файл global.asax, похожий на этот, для установки инъекции зависимостей (отлично работает)
protected void Application_Start()
{
SimpleInjectorConfig.Register();
GlobalConfiguration.Configure(WebApiConfig.Register);
}
Я создал файл Startup.Auth.cs для настройки OAuth
public class Startup
{
public void Configuration(IAppBuilder app)
{
var OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new MyAuthorizationServerProvider() // here is the problem
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
Теперь, когда я прокомментировал выше, проблема MyAuthorizationServerProvider. он принимает параметр IUserService, который я обычно вставляю. Я не хочу пустить конструктор, потому что мой IUserService также внедряет репозиторий. Вот файл
public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
private IUserService _service;
public ApiAuthorizationServerProvider (IUserService service)
{
_service = service;
}
public override async Task ValidateClientAuthentication(
OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(
OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin",
new[] { "*" });
IUserService service = Startup.Container.GetInstance<IUserService>();
User user = _service.Query(e => e.Email.Equals(context.UserName) &&
e.Password.Equals(context.Password)).FirstOrDefault();
if (user == null)
{
context.SetError("invalid_grant",
"The user name or password is incorrect.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
Как я могу заставить это работать с Injection Dependency? Это должно произойти довольно много и должно быть в состоянии сделать что-то, чтобы справиться с этим. Я уверен, что это что-то простое, но я все еще учусь.