Я пытаюсь внедрить поставщик аутентификации для своих служб 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 контроллера ...
Привет, спасибо за ответ. Два проекта (Authentication и WebApi с двумя контроллерами) на данный момент находятся в одном решении на одном компьютере. Если что-то не так с маркером, ApiController тоже не должен работать. Или я что-то недопонимаю? – dope85
@ dope85 Даже если они находятся в одном решении, если они находятся в разных проектах, вы должны установить одинаковое значение для тега machinekey в файле web.config. В другом случае, как маркер создается в процессе авторизации, он будет отличаться от способа дешифрования, который должен быть проверен в ваших веб-контроллерах api. –
@Freerider Не нужно унифицировать mahcineKey в web.config, если проекты находятся на одном компьютере, они будут работать и будут использовать machine.config not web.config –