我正在尝试使用OWIN中间件为我的ASP.NET WebAPI 2.0实现JWT身份验证。
我完成了从OAuthAuthorizationServer获取jwt令牌的第一项任务。资源所有者和令牌服务器是相同的,即相同的WebAPI生成令牌,并且也应该使用它来提供对资源的访问。
在我的Global.asax文件中,我添加了以下代码行
GlobalConfiguration.Configure(FilterConfig.Configure);
在我的Filter.config中,我添加了以下配置方法,我将其传递给Global.asax文件中的GlobalConfiguration.Configure方法。
public static void Configure(HttpConfiguration config)
{
config.Filters.Add(new System.Web.Http.AuthorizeAttribute());
}
添加此功能显然可以保护所有api免受未经授权的访问。
当我通过传递给Authorization标头的Bearer令牌点击任何api时,我只会收到“此请求的授权被拒绝”的消息。
现在令我困惑的是,当我不在我的OWIN启动文件中添加以下代码时会发生这种情况
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
只要在启动文件中添加上述代码,授权就会以某种方式被删除。而且我可以击中之前无法访问的api。无论我是否通过不必要的承载令牌,都可以访问它。
你们能指出我正确的方向吗?如果它的行为如此,那么这表明了什么?
更新
public void ConfigureAuth(IAppBuilder app)
{
var issuer = ConfigurationManager.AppSettings["issuer"];
var secret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["secret"]);
OAuthOptions = new OAuthAuthorizationServerOptions
{
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/Token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
Provider = new CustomOAuthProvider(),
AccessTokenFormat = new CustomJwtFormat(issuer)
};
app.UseOAuthAuthorizationServer(OAuthOptions);
// Enable bearer authentication with jwt
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { "Any" },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer,secret)
}
});
var hh = ConfigureWebApi();
app.UseWebApi(hh);
}
private HttpConfiguration ConfigureWebApi()
{
var config = new HttpConfiguration();
var cors = new EnableCorsAttribute("http://localhost:50374", "*", "*");
config.EnableCors(cors);
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
config.Filters.Add(new System.Web.Http.AuthorizeAttribute());
return config;
}