我正在撕开我的头发。我在登录期间成功创建了不记名令牌。当我将该令牌传递给我的授权api控制器时,一切都按预期工作。
如果我没有传递令牌或传递无效令牌,我会收到以下错误消息:
尝试创建“AccountsController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。“
我正在将对象注入到我的控制器中,因此我没有无参数构造函数。无论如何,不应该发回未经授权的回复?
这是我对OWIN的设置:
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new OauthServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
谢谢, 保罗
答案 0 :(得分:1)
构建控制器的默认ASP.NET机制需要一个无参数构造函数,除非您使用IoC容器并明确定义控制器应如何解析依赖关系。
解决这个问题的简单方法是创建一个无参数构造函数,并使用如下参数调用构造函数:
public TaskController()
: this(new TaskService(new TaskRepository()))
{
}
public TaskController(ITaskService taskService)
{
this.taskService = taskService;
}
这里的问题是你的DI不再有用了。 您必须在Startup类中配置DI。
我向您展示温莎城堡的一个例子:
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
config.Filters.Add(new WebApiAuthorizeAttribute());
...
// Dependency Resolver
var container = new WindsorContainer().Install(new WebApiControllersInstaller());
var httpDependencyResolver = new WindsorDependencyResolver(container);
config.DependencyResolver = httpDependencyResolver;
//Uncomment next lines for Composition Root DI configuration intead of Dependency Resolver
//var container = new WindsorContainer().Install(new WebApiControllersInstaller());
//config.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(container));
}