Sto creando un'applicazione Web Api e desidero utilizzare i token bearer per l'autenticazione dell'utente. Ho implementato la logica del token, seguendo this post e tutto sembra funzionare correttamente. NOTA: non sto utilizzando il provider di identità ASP.NET. Invece ho creato un'entità utente personalizzata e servizi per questo.Iniezione dipendenza Autofac in implementazione di 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());
}
}
e questa è la mia implementazione della classe SimpleAuthorizationServerProvider
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);
}
}
Dopo che io chiamo l'url/gettone, ricevo il seguente errore
No portata con un corrispondente tag 'AutofacWebRequest 'è visibile dall'ambito in cui è stata richiesta l'istanza. Questo in genere indica che un componente registrato come richiesta HTTP viene richiesto da un componente SingleInstance() o uno scenario simile. Nell'integrazione Web vengono sempre richieste dipendenze da DependencyResolver.Current o ILifetimeScopeProvider.RequestLifetime, mai dal contenitore stesso
C'è un modo per utilizzare l'iniezione di dipendenza all'interno di questa classe? Sto usando un pattern di repository per accedere alle mie entità, quindi non penso che sia una buona idea creare una nuova istanza del contesto dell'oggetto. Qual è il modo corretto per farlo?
Sei riuscito a trovare una soluzione a questo? Ho lo stesso problema e non riesco a ... grazie. – shenku
@shenku: ho aggiunto una risposta con ciò che ha funzionato per me. Spero possa essere d'aiuto. – jumuro