Ich bin eine Web-API-Anwendung erstellen und ich möchte Träger Tokens für die Benutzerauthentifizierung verwenden. Ich habe die Token-Logik nach this post implementiert und alles scheint gut zu funktionieren. HINWEIS: Ich verwende den ASP.NET Identity Provider nicht. Stattdessen habe ich eine benutzerdefinierte Benutzer-Entität und Dienste für sie erstellt.Autofac Dependency-Injektion in der Implementierung von OAuthAuthorizationServerProvider
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
var config = new HttpConfiguration();
var container = DependancyConfig.Register();
var dependencyResolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = dependencyResolver;
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(config);
WebApiConfig.Register(config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
und dies ist meine Umsetzung der SimpleAuthorizationServerProvider Klasse
private IUserService _userService;
public IUserService UserService
{
get { return (IUserService)(_userService ?? GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IUserService))); }
set { _userService = value; }
}
public async override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var user = await UserService.GetUserByEmailAndPassword(context.UserName, context.Password);
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);
}
}
Nachdem ich das/Token-URL aufrufe, erhalte ich die folgenden Fehler
keinen Raum mit einem Tag Matching ‚AutofacWebRequest 'ist aus dem Bereich ersichtlich, in dem die Instanz angefordert wurde. Dies bedeutet im Allgemeinen, dass eine Komponente, die als HTTP-Anforderung registriert ist, von einer SingleInstance() - Komponente (oder einem ähnlichen Szenario) angefordert wird. Unter der Webintegration werden immer Abhängigkeiten von DependencyResolver.Current oder ILifetimeScopeProvider.RequestLifetime angefordert, niemals vom Container selbst
Gibt es eine Möglichkeit, Abhängigkeitsinjektion in dieser Klasse zu verwenden? Ich verwende ein Repository-Muster, um auf meine Entitäten zuzugreifen. Daher denke ich nicht, dass es eine gute Idee ist, eine neue Instanz des Objektkontextes zu erstellen. Was ist der richtige Weg, dies zu tun?
Haben Sie es geschafft, eine Lösung zu finden? Ich habe das gleiche Problem und kann nicht ... danke. – shenku
@Shenku: Ich habe eine Antwort hinzugefügt mit dem, was für mich funktioniert hat. Ich hoffe, es hilft. – jumuro