从ASP.NET vNext beta5迁移到beta7后,JWT Bearer令牌身份验证错误

时间:2015-09-18 10:21:51

标签: visual-studio-2015 asp.net-core asp.net-core-mvc jwt

我从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令牌使用配置?

1 个答案:

答案 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存在并且有效),我们没有例外并且可以拒绝请求。

相关问题