我有一个使用 Simple Injector 的 WebApi,它工作得非常好,但我必须在项目中实现 OAuth。现在我已经做到了,我的 ApiControllers 给了我一个错误,比如 Simple Injector 现在已经正确设置
我有我的 Start.cs 文件
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Web API configuration and services
HttpConfiguration config = new HttpConfiguration();
Container container = SimpleInjectorConfig.Initialize(app);
ConfigureAuth(app, container);
WebApiConfig.Register(config);
app.UseWebApi(config);
}
public void ConfigureAuth(IAppBuilder app, Container container)
{
var OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = container.GetInstance<IOAuthAuthorizationServerProvider>()
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
在我的 SimpleInjectorConfig 文件中,我有
public class SimpleInjectorConfig
{
public static Container Initialize(IAppBuilder app)
{
var container = GetInitializeContainer(app);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
return container;
}
public static Container GetInitializeContainer(IAppBuilder app)
{
var container = new Container();
container.RegisterSingle<IAppBuilder>(app);
container.Register<IOAuthAuthorizationServerProvider,
ApiAuthorizationServerProvider>();
// myService
container.Register<IService, MyService>();
// myRepository
container.Register<IRepository, MyRepository>();
// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
return container;
}
}
public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
private IService _service;
public ApiAuthorizationServerProvider(IService 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[] { "*" });
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);
}
}
现在我的项目构建良好,但我无法测试 OAuth 是否正常工作,因为我无法连接到我的 ApiController。我还没有将 [Authorize] 标签添加到 Controller 中,所以我应该能够访问它。
这是我的 Controller
public class MyController : ApiController
{
private IService _service;
public MyController(IService service)
{
_service = service;
}
public IHttpActionResult Get()
{
// get all entities here via service
return Ok(list);
}
}
我收到的错误消息说
An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor.
我以为这将通过注册
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
最佳答案
在 .NET Core 中添加:
// Sets up the basic configuration that for integrating Simple Injector with
// ASP.NET Core by setting the DefaultScopedLifestyle, and setting up auto
// cross wiring.
services.AddSimpleInjector(_container, options =>
{
// AddAspNetCore() wraps web requests in a Simple Injector scope and
// allows request-scoped framework services to be resolved.
options.AddAspNetCore()
.AddControllerActivation();
});
通过 https://simpleinjector.readthedocs.io/en/latest/aspnetintegration.html
关于c# - 无法使用 Simple Injector 注册 Api Controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002866/