Neu bei Dependency Injection, so ist dies wahrscheinlich eine einfache Sache, aber ich habe versucht und kann es nicht herausfinden, ich verwende Simple Injector.Dependency Injection (mit SimpleInjector) und OAuthAuthorizationServerProvider
Ich habe ein WebApi, das SimpleInjector vollkommen in Ordnung benutzt, jetzt möchte ich Sicherheit mit OAuth implementieren.
Um dies zu tun, begann ich dieses Tutorial zu folgen, was sehr hilfreich ist, tut aber Dependency Injection
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
Ich habe meine global.asax-Datei wie folgt aussehen, die Einrichtung Dependency Injection verwenden (Arbeits perfekt)
protected void Application_Start()
{
SimpleInjectorConfig.Register();
GlobalConfiguration.Configure(WebApiConfig.Register);
}
ich habe eine Startup.Auth.cs Datei erstellt 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());
}
}
konfigurieren
Nun, wie ich oben kommentierte, MyAuthorizationServerProvider ist das Problem. Es benötigt einen Parameter von IUserService, den ich normalerweise einfüge. Ich möchte den Konstruktor nicht leeren, weil mein IUserService auch ein Repository einfügt. Hier ist die Datei
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);
}
}
Wie kann ich diese Arbeit mit Injection Abhängigkeit? Das muss ziemlich viel passieren und muss etwas damit umgehen können. Ich bin sicher, es ist etwas Einfaches, aber ich lerne immer noch.
Hoffe das hilft https: //simpleininjektor.codeplex. com/diskussionen/564822 – DSR
hast du eine andere lösung gefunden? – moyomeh
Ich verwende OpenIddict von Github und nur den Rollennamen als Anspruch speichern. Berechtigungen werden nicht gespeichert, da die Änderung auf dem Server sofort erfolgt, wenn etwas aktualisiert wird. Ich muss die Berechtigungen nur einmal pro Anfrage überprüfen, also ist das in Ordnung für mich atm – Gillardo