Nowość w Injection Dependency, więc jest to prawdopodobnie prosta sprawa, ale próbowałem i nie mogę tego zrozumieć, używam Simple Injector.Dependency Injection (za pomocą SimpleInjector) i OAuthAuthorizationServerProvider
Mam WebApi, który używa SimpleInjector doskonale dobrze, teraz chciałbym zaimplementować zabezpieczenia przy użyciu OAuth.
Aby to zrobić, zacząłem śledzić ten tutorial, który jest bardzo pomocny, ale nie robi używać dependancy wtryskowa
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
mam pliku global.asax patrząc jak ten, do iniekcji setup dependancy (praca idealny)
protected void Application_Start()
{
SimpleInjectorConfig.Register();
GlobalConfiguration.Configure(WebApiConfig.Register);
}
Stworzyłem plik Startup.Auth.cs skonfigurować 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());
}
}
Jak już pisałem powyżej, problemem jest usługa MyAuthorizationServerProvider. wymaga parametru IUserService, który zwykle wstrzykuję. Nie chcę pustego konstruktora, ponieważ moja IUserService także wstrzykuje repozytorium. Poniżej znajduje się plik
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);
}
}
Jak mogę to osiągnąć przy pomocy Dependency Injection? To musi się wydarzyć całkiem sporo i musi być w stanie zrobić coś, żeby sobie z tym poradzić. Jestem pewien, że jest to coś prostego, ale wciąż się uczę.
Mam nadzieję, że to pomoże https: //simpleinjector.codeplex. com/discussions/564822 – DSR
znalazłeś jakieś inne rozwiązanie? – moyomeh
Używam OpenIddict z github i przechowuję tylko nazwę roli jako roszczenie. Uprawnienia nie są przechowywane, ponieważ jeśli coś jest aktualizowane, zmiana jest natychmiastowa na serwerze. Muszę tylko sprawdzić uprawnienia raz na żądanie, więc to jest w porządku dla mnie atm – Gillardo