Я пытаюсь реализовать поставщика аутентификации для своих служб 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 Controller.
Когда я вызываю localhost: Port / api / TestApi и устанавливаю токен-носитель в заголовке, все работает нормально. Когда я вызываю localhost: Port / odata / TestOData и добавляю токен, я получаю сообщение:
В авторизации для этого запроса отказано.
Неважно, установил ли я токен в заголовке или нет. Если я удалю атрибут Authorize, все будет работать нормально. Я использую Postman для вызова методов, если это интересно. На данный момент я использую iis-express из Visual Studio для размещения контроллеров, но 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));
}
}
Но я понятия не имею, почему он работал раньше с контроллером api, а не с контроллером odata ...