我正在尝试为我的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);
}
}我的目标是最终使用。
当我调用localhost:Port/api/TestApi并在标头中设置Bearer时,一切都正常。当我调用localhost:Port/odata/TestOData并添加令牌时,我收到消息:
这一请求的授权已被拒绝。
我是否在标头中设置标记并不重要。如果我移除授权属性,一切都可以正常工作。我用邮递员打电话给这些方法,如果有兴趣的话。目前,我正在使用来自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演示的例子几乎相同。
我看不出这些控制器之间有什么区别。Auhtorize属性是由controller...but识别的,有些地方是错误的。如有任何提示,将不胜感激。
更新后,经过一些研究和第一个答案,我更新了我的启动值。旧选项仅用于令牌生成,而不是令牌消耗。但是api控制器仍然工作,OdataController抛出“授权拒绝”。
Update2现在起作用了。但我不太确定为什么。我从我的FilterConfig中删除了所有东西:
public class FilterConfig
{
public static void Register(HttpConfiguration config)
{
//config.SuppressDefaultHostAuthentication();
//config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
}
}但是我不知道为什么它以前和api控制器一起工作,而不是和odata控制器一起工作.
发布于 2015-04-08 14:05:21
如果您使用一个项目获取令牌,而另一个项目用于webApi,则两者在web.config中都必须具有相同的机器密钥。
在下面这个系列的下一篇文章中,您将解释如何做到这一点:从资源服务器中分离所有者授权服务器
示例:
<system.web>
...
<machineKey validationKey="57B449BBA8F9E656087FF7848727E122C5F5966F65AC0FC25FB3532193B59CFCD13B370883FFC184C1F1500638F33E6F67B37CAED1D9BC65BBC6CFFB232BFD0B" decryptionKey="6D9FBE88D16B3FA5B5E6B37460BBE50DA85D5B4C482159006B5A337C58AA9E79" validation="SHA1" decryption="AES" />
...
</system.web>发布于 2015-10-17 02:50:50
我有类似的问题,并发现这个答案张贴在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
https://stackoverflow.com/questions/29516639
复制相似问题