Otorisasi OpenIddict .Net Core 2.0 Web API: mengalihkan ke indeks alih-alih mengembalikan data json

Jadi, masalahnya adalah ketika saya menggunakan AuthorizeAttribute di atas pengontrol api saya, ia berhenti bekerja seperti yang diharapkan.

Saat saya memanggil tindakan getAllUsers, alih-alih mengembalikan pengguna dalam format json, Identitas entah bagaimana dialihkan ke index.html dan kemudian saya mendapatkan kesalahan parser json di aplikasi klien Angular saya, karena html bukan data json valid yang dapat diurai.

Ini mulai terjadi setelah memutakhirkan ke Asp.Net Core 2.0.

Saya pikir mungkin saya harus mengubah sesuatu di Startup.cs atau Program.cs saya. Tapi aku tidak tahu apa.

Saya telah mengikuti Contoh Refresh Token di OpenIddict untuk Core 2.0 baru, dan semuanya tampak baik-baik saja.

Jadi ini kode saya...

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);
        }
    }
}

Jika saya menempatkan breakpoint dalam metode GetAllUsers, itu tidak akan pernah terkena. Entah bagaimana karena otorisasi, aplikasi dialihkan ke index.html sebelumnya.

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();
}

Omong-omong, otentikasi berfungsi. Saya bisa mendapatkan token, tetapi tidak dapat mengotorisasi akses pengontrol.


person Jackson Mourão    schedule 20.08.2017    source sumber


Jawaban (1)


Menyelesaikannya. Hanya perlu sedikit konfigurasi seperti yang saya kira. Cukup tambahkan opsi DefaultAuthenticateScheme seperti ini:

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

Setelah menambahkan ini, pengontrol mulai bekerja dengan benar, menghasilkan data json dan bukan index.html.

person Jackson Mourão    schedule 21.08.2017