OWIN持有人令牌无效时无法使用授权

时间:2014-07-09 17:30:42

标签: asp.net-web-api oauth-2.0 authorization owin

我正在撕开我的头发。我在登录期间成功创建了不记名令牌。当我将该令牌传递给我的授权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());

谢谢, 保罗

1 个答案:

答案 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));

}