Я создаю приложение Web Api, и я хочу использовать токены-носители для аутентификации пользователя. Я реализовал логику токена, следуя this post, и все работает нормально. ПРИМЕЧАНИЕ. Я не пользуюсь поставщиком удостоверений ASP.NET. Вместо этого я создал для него пользовательский объект и службы.Запуск зависимостей Autofac в реализации 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());
}
}
и это моя реализация класса 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);
}
}
После того как я называю маркером URL /, я получаю ошибку при слежении
Нет сферу с согласованием тегов «AutofacWebRequest 'видно из области, в которой запрашивался экземпляр. Это обычно указывает на то, что компонент, зарегистрированный в качестве HTTP-запроса, запрашивается компонентом SingleInstance() (или аналогичным сценарием). В рамках веб-интеграции всегда запрашиваются зависимости от DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, никогда из самого контейнера
Есть ли способ использовать инъекцию зависимостей внутри этого класса? Я использую шаблон репозитория для доступа к моим объектам, поэтому я не думаю, что это хорошая идея создать новый экземпляр контекста объекта. Каков правильный способ сделать это?
Удалось ли вам найти решение этого вопроса? У меня такая же проблема, и я не могу ... спасибо. – shenku
@shenku: Я добавил ответ с тем, что сработало для меня. Я надеюсь, что это помогает. – jumuro