【发布时间】:2015-04-08 13:51:39
【问题描述】:
我正在尝试为我的 WebApi 服务实现身份验证提供程序。 我正在使用本指南:http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/ 出于测试目的,我在一个单独的 webapi-project 中实现了两个控制器:
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 并在标头中设置承载令牌时,一切正常。当我调用 localhost:Port/odata/TestOData 并添加令牌时,我会收到消息:
此请求的授权已被拒绝。
我是否在标头中设置令牌都没有关系。如果我删除 Authorize 属性一切正常。 如果有任何兴趣,我正在使用 Postman 调用这些方法。 目前我正在使用 Visual Studio 中的 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 中的示例代码几乎相同。
我看不出这些控制器之间的区别。控制器识别了Authorize 属性……但还有其他问题。 任何提示将不胜感激。
更新 经过一些研究和第一个答案后,我更新了我的启动值。旧选项仅对代币生成而非代币消费是必需的。但是 api 控制器仍然有效,并且 OdataController 抛出“授权被拒绝”。
更新2 它现在起作用了。但我不太清楚为什么。我从我的 FilterConfig 中删除了所有内容:
public class FilterConfig
{
public static void Register(HttpConfiguration config)
{
//config.SuppressDefaultHostAuthentication();
//config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
}
}
但我不知道为什么它之前使用 api 控制器而不是 odata 控制器...
【问题讨论】:
标签: asp.net-web-api odata owin