.Net Core 2.0 Web API OpenIddict授权:重定向到索引而不是返回json数据

时间:2017-08-20 17:14:28

标签: openiddict asp.net-core-2.0

所以,问题是当我在api控制器上使用AuthorizeAttribute时,它会以预期的方式停止工作。

当我调用getAllUsers操作时,而不是以json格式返回用户,Identity会以某种方式重定向到index.html然后我的Angular客户端应用程序中出现json解析器错误,因为html是无效的json数据,可以被解析。

升级到Asp.Net Core 2.0之后就开始了。

我想也许我必须在Startup.cs或Program.cs中改变一些东西。但我无法弄清楚是什么。

我已经在OpenIddict上关注了新的Core 2.0上的Refresh Token Sample,一切似乎都没问题。

所以这是我的代码......

Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options => {
            options.UseSqlServer(Configuration.GetConnectionString("LocalDB"))
                .UseOpenIddict();
        });
        services.AddScoped<IUserRepository, UserRepository>();
        services.AddScoped<IRoleRepository, RoleRepository>();
        services.AddScoped<IManadRepository, ManadRepository>();
        services.AddScoped<IManadRubricaRepository, ManadRubricaRepository>();
        services.AddScoped<IManadSistemaRepository, ManadSistemaRepository>();
        services.AddScoped<IRestituicaoRepository, RestituicaoRepository>();
        services.AddTransient<ApplicationDbSeedData>();

        services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
            {
                options.User.RequireUniqueEmail = true;
                options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name;
                options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject;
                options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;
            })
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddOpenIddict(options =>
        {
            options.AddEntityFrameworkCoreStores<ApplicationDbContext>();
            options.AddMvcBinders();
            options.EnableTokenEndpoint("/connect/token");
            options.AllowPasswordFlow();
            options.AllowRefreshTokenFlow();

            if (!_env.IsProduction())
                options.DisableHttpsRequirement();
        });

        // Add framework services.
        services.AddMvc();

        services.AddAuthentication()
            .AddOAuthValidation();

        services.AddAuthorization();

        services.AddTransient<IMailSender, MailjetSender>();

        services.AddScoped<IManadParser, ManadParser>();
    }

public void Configure(IApplicationBuilder app, ApplicationDbSeedData dbDataSeeder)
    {        
        if (_env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile<AutoMapperProfile>();
        });

        app.UseStaticFiles();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });

        dbDataSeeder.EnsureSeedData().Wait();
    }

UsersController.cs

[Route("api/[controller]")]
[Authorize]
public class UsersController : Controller
{
    [HttpGet]
    [Authorize(Roles = "Administrador")]
    public IActionResult GetAllUsers()
    {
        try
        {
            var result = _repository.GetAllUsers();  

            return Ok(result);
        }
        catch (Exception ex)
        {
            _logger.LogError($"Failed to get all users: {ex}");

            return BadRequest(ex.Message);
        }
    }
}

如果我在GetAllUsers方法中放置断点,它永远不会被击中。不知何故,由于授权,应用程序之前会重定向到index.html。

Program.cs的

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

顺便说一下,身份验证正在运行。我能够获得令牌,但无法授权控制器访问。

1 个答案:

答案 0 :(得分:5)

解决了它。只需要像我想的那样需要一些配置。只需添加DefaultAuthenticateScheme选项,如下所示:

services.AddAuthentication(options => options.DefaultAuthenticateScheme = OAuthValidationDefaults.AuthenticationScheme)
            .AddOAuthValidation();

添加后,控制器开始正常工作,产生json数据,而不是index.html。