我正在尝试为我的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控制器...
答案 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