Как добавить действие к контроллеру в api mvc project net core 3.1 - PullRequest
2 голосов
/ 27 мая 2020

Я пытаюсь создать IdentityServer4, исходя из примера Microsoft.

Пример содержит проект Api и клиент mcv для аутентификации и вызова api.

enter image description here

Проект Api Startup.cs:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddAuthentication("Bearer")
            .AddJwtBearer("Bearer", options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.Audience = "api1";
            });
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Api IdentityController.cs:

namespace Api.Controllers
{
    [Route("identity")]
    [Authorize]
    public class IdentityController : ControllerBase
    {
        public IActionResult Get()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }
    }
}

этот код в MvcClient правильно вызывает действие IdentityController :

public async Task<IActionResult> CallApi()
{
        var accessToken = await HttpContext.GetTokenAsync("access_token");

        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        var content = await client.GetStringAsync("http://localhost:5001/identity");

        ViewBag.Json = JArray.Parse(content).ToString();
        return View("json");
}

Я добавил одно действие с именем Test в IdentityController:

namespace Api.Controllers
{
    [Route("identity")]
    [Authorize]
    public class IdentityController : ControllerBase
    {
        public IActionResult Get()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }

        public IActionResult Test()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }
    }
}

Но этот код 404 не найден в McvClient:

public async Task<IActionResult> CallTestApi()
{
        var accessToken = await HttpContext.GetTokenAsync("access_token");

        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        var content = await client.GetStringAsync("http://localhost:5001/identity/Test");

        ViewBag.Json = JArray.Parse(content).ToString();
        return View("json");
}

enter image description here

1 Ответ

1 голос
/ 27 мая 2020

В этом примере используется шаблон маршрута HTTP-глагола . Как видите, [Route("identity")] находится на уровне контроллера, а Get подпадает под get по умолчанию для контроллера. Но для действия Test нужно добавить [HttpGet("test")]. Подробнее о маршрутизации здесь . Код будет таким:

namespace Api.Controllers
{
    [Route("identity")]
    [Authorize]
    public class IdentityController : ControllerBase
    {
        public IActionResult Get()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }

        [HttpGet("test")]
        public IActionResult Test()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }
    }
}
...