ASP. NET Core Identity & Web API Security - PullRequest
0 голосов
/ 11 апреля 2020

Я создал ASP. NET Core 3.1 веб-сайт и веб-API, проект, в котором он работает с ASpNetIdentity в SQL Серверной базе данных, веб-часть работает нормально ... также я могу аутентифицироваться веб-API и получить access_token ... но когда я пытаюсь получить доступ к своим ресурсам / API / транспортных средств, я получаю перенаправление входа в систему на страницу входа ...

Startup.cs / ConfigureServices

        services.AddDbContext<ApplicationDbContext>(options =>
          options.UseSqlServer(connectionString));

        services.AddIdentity<IdentityUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options =>
        {
            options.Password.RequireDigit = true;
            options.Password.RequireLowercase = true;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = true;
            options.Password.RequiredLength = 6;
            options.Password.RequiredUniqueChars = 1;

            options.SignIn.RequireConfirmedEmail = false;
            options.SignIn.RequireConfirmedPhoneNumber = false;

            options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
            options.User.RequireUniqueEmail = false;
        });

        services.ConfigureApplicationCookie(options =>
        {
            options.AccessDeniedPath = "/Account/AccessDenied";
            options.Cookie.Name = "AgencyCookie";
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
            options.LoginPath = "/Account/Login";
            options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
            options.SlidingExpiration = true;
        });

        services.AddControllersWithViews();
        services.AddRazorPages();

        services.AddMvc(options => options.EnableEndpointRouting = false);//.AddAuthorization();

        services.AddDbContext<AgenciaDeTransporteContext>(o =>
        {
            o.UseSqlServer(connectionString);
        });

        services.AddScoped<IAgenciaDeTransporteRepository, AgenciaDeTransporteRepository>();

        services.AddIdentityServer()
            .AddAspNetIdentity<IdentityUser>()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetAllResources())
            .AddInMemoryClients(Config.AllClients);

        services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme);

Startup.cs / Configure

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

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

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

        app.UseStatusCodePages();
        app.UseMvc();

        app.UseIdentityServer();

VehiclesController.cs

[Route("api/[controller]")]
[ApiController]
[Authorize]
public class VehiclesController : ControllerBase
{

    private readonly IAgenciaDeTransporteRepository _repository;
    private readonly ILogger<VehiclesController> _logger;
    public VehiclesController(ILogger<VehiclesController> logger, IAgenciaDeTransporteRepository repository)
    {
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        _repository = repository ?? throw new ArgumentNullException(nameof(repository));
    }

    [HttpGet]
    public IActionResult GetVehicles()
    {           
        return Ok(_repository.GetVehicles());
    }

Config.cs

new Client
        {
            ClientId = "myClient",
            ClientName = "My Custom Client",
            RequireConsent = false,
            ClientSecrets = new List<Secret>{new Secret("secret".Sha256())},
            AccessTokenLifetime = 60 * 60 * 24,
            AllowedGrantTypes = GrantTypes.ClientCredentials,
            RequireClientSecret = false,
            AllowAccessTokensViaBrowser = true,
            AllowedScopes =
            {
                "myAPIs"
            }
        }

enter image description here

Но когда я использую токен, он посылает мне «перенаправление» на страницу входа в систему ...

enter image description here

enter image description here

...