.Net Core 2 API Как получить текущего зарегистрированного пользователя?

В данный момент эта проблема меня очень сильно волнует. Никогда не было проблем в Web API 2, сейчас в Core, я не могу получить текущие утверждения или идентификационные данные для пользователя, который вошел в систему.

Когда приложение запускается, вызывается Index() IActionResult, и пользователь входит в систему с помощью метода SignInAsync().

    public async Task<IActionResult> Index()
    {
        var claims = new List<Claim>()
        {
            new Claim(ClaimTypes.Name, "CA19207"),
            new Claim(ClaimTypes.Actor, "2770"),
            new Claim(ClaimTypes.DateOfBirth, "User")
        };

        var identity = new ClaimsIdentity(claims, "TNEVP");
        var principal = new ClaimsPrincipal(identity);

        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

      var isIn = principal.Identity.IsAuthenticated;//returns true
      var isAuthed = (HttpContext.User.Identity as ClaimsIdentity).IsAuthenticated;//returns false

        return Ok();
    }

Затем из службы Angular 2 я звоню api/user, чтобы получить претензии для вошедшего в систему пользователя. Однако набор претензий пуст, а пользователь не аутентифицирован.

    [HttpGet("claims")]
    public async Task<IEnumerable<Claim>> Get()
    {
        var claims = (User as ClaimsPrincipal).Claims;
        return await Task.FromResult(claims);
    }

Разметка в классе Startup является базовой:

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddAuthentication(o =>
            {
                o.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie(o =>
            {
                o.LoginPath = "/api/login";
                o.LogoutPath = "/api/logout";
                // additional config options here
            });

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseAuthentication();

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

Так чего мне здесь не хватает? Это должна быть простая реализация для создания заявок и их последующего обслуживания через вызов API. Спасибо!~

ОБНОВЛЕНИЕ У меня сейчас это работает в Core 1.1, заняло около 30 минут. Я хотел бы знать, что я делаю неправильно в Core 2.

Вот код: Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddAuthorization();
        services.AddAuthentication(options =>
        {
            options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        });

        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

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

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationScheme = "Cookies",
            AutomaticAuthenticate = true,
            CookieName = "MyCookie",
            AutomaticChallenge = true,
            LoginPath = "/Home/Login"
        });

        app.UseStaticFiles();

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

     HomeController.cs
    public async Task<IActionResult> SignIn()
    {
        var claims = new List<Claim>()
        {
            new Claim(ClaimTypes.Name, "Robert Lee"),
            new Claim(ClaimTypes.NameIdentifier, "CA2770"),
            new Claim(ClaimTypes.DateOfBirth, "8-8-2018")
        };

        var userIdentity = new ClaimsIdentity(claims, "SessionClaim");

        var userPrincipal = new ClaimsPrincipal(userIdentity);

        await HttpContext.Authentication.SignInAsync
        (CookieAuthenticationDefaults.AuthenticationScheme, 
         userPrincipal,
            new AuthenticationProperties
            {
                ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
                IsPersistent = false,
                AllowRefresh = false
            });

        return View();
    }

    SessionController.cs

    [HttpGet("claims", Name = "GetClaims")]
    public async Task<IEnumerable<Claim>> GetClaims()
    {
        var user = (User as ClaimsPrincipal);
        var claims = user.Claims;
        var isAuthed = user.Identity.IsAuthenticated;

        return await Task.FromResult(claims);
    } 

0 ответов

Другие вопросы по тегам