Autofac-Abhängigkeitsinjektion bei der Implementierung von OAuthAuthorizationServerProvider

Ich erstelle eine Web-API-Anwendung und möchte Inhaber-Token für die Benutzerauthentifizierung verwenden. Ich habe die Token-Logik implementiert, indem ichdieser Beitra und alles scheint gut zu funktionieren. HINWEIS: Ich verwende nicht den ASP.NET-Identitätsanbieter. Stattdessen habe ich eine benutzerdefinierte Benutzerentität und Dienste dafür erstellt.

 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 Implementierung 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 die / token-URL aufgerufen habe, erhalte ich die folgende Fehlermeldung:

n dem Bereich, in dem die Instanz angefordert wurde, ist kein Bereich mit einem Tag sichtbar, das mit "AutofacWebRequest" übereinstimmt. Dies zeigt im Allgemeinen an, dass eine als Per-HTTP-Anforderung registrierte Komponente von einer SingleInstance () - Komponente angefordert wird (oder einem ähnlichen Szenario). Bei der Webintegration fordern Sie Abhängigkeiten immer vom DependencyResolver.Current oder ILifetimeScopeProvider.RequestLifetime an, niemals vom Container selbst

Gibt es eine Möglichkeit, die Abhängigkeitsinjektion in dieser Klasse zu verwenden? Ich verwende ein Repository-Muster, um auf meine Entitäten zuzugreifen. Daher halte ich es nicht für sinnvoll, eine neue Instanz des Objektkontexts zu erstellen. Was ist der richtige Weg, um dies zu tun?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage