我从beta5迁移到beta7 ASP.NET vNext,当我尝试使用无效的JWT令牌或根本没有令牌访问受保护的API控制器时出现以下错误:
InvalidOperationException:以下身份验证方案不是 公认: Microsoft.AspNet.Http.Authentication.Internal.DefaultAuthenticationManager.d__10.MoveNext()
如果我尝试使用有效令牌访问受保护的控制器,我可以成功获得响应。
这是我受保护的控制器:
[Authorize]
[Route("api/protected")]
public class ProtectedController : Controller
{
[Route("")]
public IEnumerable<object> Get()
{
var identity = User.Identity as ClaimsIdentity;
return identity.Claims.Select(c => new
{
Type = c.Type,
Value = c.Value
});
}
}
这是我的Startup类:
public class Startup
{
public Startup(IHostingEnvironment env)
{
}
public static IConfiguration Configuration { get; set; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
// Configure is called after ConfigureServices is called.
public void Configure(IApplicationBuilder app, IApplicationEnvironment env)
{
ConfigureOAuthTokenConsumption(app);
app.UseMiddleware<StaticFileMiddleware>(new StaticFileOptions());
app.UseErrorPage();
app.UseMvc();
}
private void ConfigureOAuthTokenConsumption(IApplicationBuilder app)
{
// Api controllers with an [Authorize] attribute will be validated with JWT
app.UseOwin(addToPipeline =>
{
addToPipeline(next =>
{
var appBuilder = new AppBuilder();
appBuilder.Properties["builder.DefaultApp"] = next;
var issuer = Settings.Issuer;
var audience = Settings.Audience;
var secret = TextEncodings.Base64Url.Decode(Settings.Secret);
appBuilder.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
},
});
return appBuilder.Build<AppFunc>();
});
});
}
}
当我在测试版5时它工作正常。当我请求没有有效令牌的受保护控制器时,我得到了401响应,这是正确的行为。 我是否需要在ASP.NET vNext beta7中更改JWT令牌使用配置?
答案 0 :(得分:2)
我测试了代码,我看到的是JWT令牌没有正常工作
[Authorize]
属性。因此,在控制器级别,用户经过身份验证,声明就在那里。
还有另一个与CORS设置有关的问题,因为通过Postman调用网站工作正常,但是当我从不同的域访问它时,我有
即使我传递有效令牌,也会出现未接受以下身份验证方案:
错误。
与AuthorizationFilterAttribute
相同的故事 - 用户始终未在过滤器中进行身份验证,但在操作中确定。
到目前为止,我找到的唯一解决方法是在执行操作之前添加ActionFilterAttribute
并检查权限
public override void OnActionExecuting(ActionExecutingContext context)
{
var principal = context.HttpContext.User.Identity as ClaimsIdentity;
if (!principal.IsAuthenticated)
{
context.Result = new HttpUnauthorizedResult();
}
base.OnActionExecuting(context);
}
此处用户已通过身份验证(如果JWT存在并且有效),我们没有例外并且可以拒绝请求。