Asp.net web api OWIN承载令牌无效时无法与Authorize一起使用

Asp.net web api OWIN承载令牌无效时无法与Authorize一起使用,asp.net-web-api,oauth-2.0,authorization,owin,Asp.net Web Api,Oauth 2.0,Authorization,Owin,我要把头发扯下来。我正在登录期间成功创建承载令牌。当我将该令牌传递给我的授权api控制器时,一切正常 如果我没有传递令牌或传递无效令牌,则会收到以下错误消息: 尝试创建“AccountsController”类型的控制器时出错。确保控制器具有无参数公共构造函数。“ 我正在将对象注入我的控制器,所以我没有无参数构造函数。无论如何,不应该发回未经授权的响应吗 以下是我对OWIN的设置: OAuthAuthorizationServerOptions OAuthServerOptions =

我要把头发扯下来。我正在登录期间成功创建承载令牌。当我将该令牌传递给我的授权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());
谢谢,
Paul

构建控制器的默认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));

}
当依赖项解析器尝试创建作为参数注入AccountsController构造函数的实例时,例如,如果您尝试注入AccountsController的对象的构造函数抛出异常,则会导致此错误(很难理解)。该异常为“被框架吞没,你只会得到你正在描述的错误…所以试着理解在你的场景中创建对象时会发生什么。我通常通过临时删除DI来诊断这些事情,以便看到实际的异常。。。