2015-04-08 4 views
1

Я пытаюсь внедрить поставщик аутентификации для своих служб WebApi. Im, используя это руководство: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/ Для целей тестирования я уже реализованы два контроллера в отдельном WebAPI-проекта:ODataController BearerToken Авторизация отказано

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 Controller в конце.

Когда я позвоню localhost: Порт/api/TestApi и установите токен-носитель в заголовке, все работает отлично. Когда я сделать вызов Localhost: порт/OData/TestOData и добавить маркер я получить сообщение:

Authorization has been denied for this request.

Это не имеет значения, если я установить маркер в заголовке или нет. Если я удалю атрибут Авторизовать, все будет работать нормально. Я использую Postman для вызова методов, если это представляет интерес. В настоящее время я использую iis-express из визуальной студии для размещения контроллеров, но iis настроен в альфах, но создает одно и то же сообщение.

Мои 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)); 
    } 
} 

Но я понятия не имею, почему он работал раньше с контроллером апи и не с OData контроллера ...

ответ

0

Если вы используете один проект для получения токен и другое для webApi, оба должны иметь один и тот же машинный ключ в web.config.

В следующем посте того же сериала, что вы следуете объясняет, как это сделать: Decouple OWIN Authorization Server from Resource Server

Пример:

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

Привет, спасибо за ответ. Два проекта (Authentication и WebApi с двумя контроллерами) на данный момент находятся в одном решении на одном компьютере. Если что-то не так с маркером, ApiController тоже не должен работать. Или я что-то недопонимаю? – dope85

+0

@ dope85 Даже если они находятся в одном решении, если они находятся в разных проектах, вы должны установить одинаковое значение для тега machinekey в файле web.config. В другом случае, как маркер создается в процессе авторизации, он будет отличаться от способа дешифрования, который должен быть проверен в ваших веб-контроллерах api. –

+0

@Freerider Не нужно унифицировать mahcineKey в web.config, если проекты находятся на одном компьютере, они будут работать и будут использовать machine.config not web.config –

0

Почему вы используете app.UseCookieAuthentication(new CookieAuthenticationOptions()); и app.UseOAuthAuthorizationServer(OAuthOptions); в то же время, я думаю, это только проект API без MVC, не так ли? Снимите app.UseOAuthAuthorizationServer(OAuthOptions); и повторите попытку.

Каково значение в заголовке ответа (WWW-Authenticate), когда вы получаете 401? Носитель или что-то еще?

+0

После удаления линии, все тот же Ошибка. Я подумал, что это дополнительная опция для использования файлов cookie AND Bearer. Ни один из них. Заголовки Postman: 'Access-Control-Allow-Origin → * Cache-Control → no-cache Content-Length → 97 Content-Type → application/json; odata.metadata = минимальная Дата → Чт, 9 апреля 2015 5:53:14 GMT Истекает → -1 OData-версия → 4,0 Pragma → нет кэша сервера → Microsoft-IIS/8.5 X-Сеть САШ-версия → 4.0.30319 X-Powered-By → ASP.NET' и тело '{ « ошибка »: { « код »:« ", « сообщение »:« Авторизация была отклонена для этого запроса ». } } ' – dope85

0

У меня была аналогичная проблема, и я нашел этот ответ на веб-сайте Telerik, и это сработало для меня. Это потребовало установки типа dataType на «json».

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

}, 

Это URL: http://www.telerik.com/forums/odata-not-working-with-custom-authorization-header

+1

Не забудьте форматировать код, выбрав текст и нажав кнопку {} на панели инструментов, это значительно упрощает чтение кода. – Lima

Смежные вопросы