ODataController BearerToken授权被拒绝

时间:2015-04-08 13:51:40

标签: asp.net-web-api odata owin

我正在尝试为我的WebApi服务实现身份验证提供程序。 我正在使用本指南:http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/ 出于测试目的,我在一个单独的webapi项目中实现了两个控制器:

public class TestApiController : ApiController
{
    [Authorize]
    public string Get()
    {
        return "Secure";
    }

    public string Get(int id)
    {
        return "Not Secure";
    }
} 

public class TestODataController : ODataController
{
    [Authorize]
    [EnableQuery]
    public HttpResponseMessage Get()
    {
       return new HttpResponseMessage(HttpStatusCode.OK); 
    }
}

我的目标是最终使用Odata控制器。

当我调用 localhost:Port / api / TestApi 并在Header中设置Bearer Token时,一切正常。当我打电话 localhost:端口/ odata / TestOData 并添加令牌时,我会收到消息:

  

此请求已被拒绝授权。

如果我在标头中设置令牌并不重要。如果我删除授权属性一切正常。 我正在使用Postman来调用这些方法,如果有任何兴趣的话。 目前我正在使用visual studio中的iis-express来托管控制器,但iis已被配置,但会生成相同的消息。

My Startup.cs(有趣的部分......)

public void Configuration(IAppBuilder app)
{
    var config = new HttpConfiguration();

    ConfigureOAuth(app);

    FilterConfig.Register(config);
    ODataConfig.Register(config);
    WebApiConfig.Register(config);

    app.UseCors(CorsOptions.AllowAll);
    app.UseWebApi(config);
}

public void ConfigureOAuth(IAppBuilder app)
{
    //Token consumption
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
    {});
}

OData和WebConfig:

public class ODataConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
        modelBuilder.EntitySet<MyModel>("MyModel");

        var conventions = ODataRoutingConventions.CreateDefault();

        var route = config.Routes.MapODataRouteFixed(
            routeName: "ODataRoute",
            routePrefix: "odata",
            model: modelBuilder.GetEdmModel(),
            conventions: conventions) as Route;
    }
}

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

添加新用户的帐户控制器位于另一个项目中。数据库看起来很好,令牌生成也可以。它与 bitoftech-demo 中的示例几乎相同。

我没有看到这些控制器之间的区别。 Auhtorize属性由控制器识别......但其他错误。 任何提示都将不胜感激。

更新 经过一些研究和第一个答案,我更新了我的启动值。旧选项仅对令牌生成而非令牌消耗是必需的。但仍然api控制器工作,OdataController抛出“授权被拒绝”。

UPDATE2 它现在有效。但我不太清楚为什么。我从 FilterConfig 中删除了所有内容:

public class FilterConfig
{
    public static void Register(HttpConfiguration config)
    {
        //config.SuppressDefaultHostAuthentication();
        //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    }
}

但我不知道为什么它之前使用的是api控制器,而不是odata控制器...

3 个答案:

答案 0 :(得分:0)

如果您使用一个项目获取令牌而另一个项目用于webApi,则两者必须在web.config中具有相同的机器密钥。

在您关注的同一系列文章的下一篇文章中解释了如何执行此操作:Decouple OWIN Authorization Server from Resource Server

示例:

<system.web>
...
<machineKey validationKey="57B449BBA8F9E656087FF7848727E122C5F5966F65AC0FC25FB3532193B59CFCD13B370883FFC184C1F1500638F33E6F67B37CAED1D9BC65BBC6CFFB232BFD0B" decryptionKey="6D9FBE88D16B3FA5B5E6B37460BBE50DA85D5B4C482159006B5A337C58AA9E79" validation="SHA1" decryption="AES" />
...
</system.web>

答案 1 :(得分:0)

为什么你在同一时间使用app.UseCookieAuthentication(new CookieAuthenticationOptions());app.UseOAuthAuthorizationServer(OAuthOptions);,我想这只是没有MVC的API项目,对吧? 移除app.UseOAuthAuthorizationServer(OAuthOptions);,然后重试。

收到401时,响应标头(WWW-Authenticate)的值是多少?持票人还是别的什么?

答案 2 :(得分:0)

我有类似的问题,发现这个答案发布在Telerik网站上,它对我有用。它需要将dataType设置为“json”。

transport: {
    type: "odata",
     read: {
         url: "http://........",
         dataType: "json",
         beforeSend: function (xhr) {
             var auth = 'Bearer ' + token;
             xhr.setRequestHeader('Authorization', auth);
         }
     },

 },

这是网址: http://www.telerik.com/forums/odata-not-working-with-custom-authorization-header