Получить запрашивающего пользователя в методе контроллера приложения ASP.NET - PullRequest
0 голосов
/ 26 мая 2019

В настоящее время я работаю над веб-приложением ASP.NET с угловым интерфейсом. В качестве основы, новый шаблон присутствует в VisualStudio 2019 для ASP.NET angular, с индивидуальной аутентификацией .

Это работает на dotnet core 3.0 Preview 4.

enter image description here

Сначала пользователь создается через интерфейс register шаблона приложения. Затем, когда делается запрос к контроллеру серверной части, я хотел бы получить ApplicationUser, который сделал запрос.

Это возможно? Нужно ли добавлять какой-либо токен в заголовок http-запроса во внешнем интерфейсе? Нужно ли делать что-то особенное в бэкэнде?

В настоящее время HTTP-запрос в контроллере выглядит следующим образом.

import { Component, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from "@angular/router";
import { error } from 'protractor';

@Component({
  selector: 'app-classes-component',
  templateUrl: './classes.component.html'
})
export class ClassesComponent {
  public classes: Class[];
  public http: HttpClient;
  public baseUrl: string;
  public courseCodeValue: string;

  constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string, private router: Router) {
    this.http = http;
    this.baseUrl = baseUrl;
    this.refreshCourses();
  }

  public refreshCourses() {
    this.http.get<Class[]>(this.baseUrl + 'api/Courses/GetCourses').subscribe(result => {
      this.classes = result;
    }, error => console.error(error));
  }
}

Контроллер выглядит так:

    [Authorize]
    [Route("api/[controller]")]
    public class CoursesController : Controller
    {

        private readonly UserManager<ApplicationUser> _userManager;

        public CoursesController(UserManager<ApplicationUser> userManager)
        {
            _userManager = userManager;
        }


        [HttpGet("[action]")]
        public IEnumerable<CourseDto> GetCourses()
        {
            var user = _userManager.GetUserAsync(User).Result;

            // Here the user is null
            return user.Courses.Select(item => new CourseDto
            {
                CourseCode = item.CourseCode,
                CurrentGrade = item.CurrentGrade
            });

        }
    }

Проблема в том, что когда я пытаюсь получить пользователя, который делает http-запрос с помощью usermanager, я получаю значение NULL. Так что мне было интересно, если я что-то упустил. Как, возможно, какой-то токен в заголовке запроса? Я что-то не так делаю на стороне контроллера?

РЕДАКТИРОВАТЬ: здесь Startup.cs код

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddDefaultIdentity<ApplicationUser>()
                .AddDefaultUI(UIFramework.Bootstrap4)
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

            services.AddAuthentication()
                .AddIdentityServerJwt();
            services.AddMvc(options => options.EnableEndpointRouting = false)
                .AddNewtonsoftJson();

            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseAuthentication();
            app.UseIdentityServer();

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

            app.UseSpa(spa =>
            {
                // To learn more about options for serving an Angular SPA from ASP.NET Core,
                // see https://go.microsoft.com/fwlink/?linkid=864501

                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });
        }
    }

1 Ответ

0 голосов
/ 26 мая 2019

Вы можете использовать «User.Identity.Name», чтобы получить UserId пользователя, отправляющего запрос, а затем передать его FindByIdAsync ().

var user = await _userManager.FindByIdAsync (User.Identity.Name);

или удар по дБ по идентификатору пользователя (User.Identity.Name);

, который когда-либо работает для вас лучше всего.

Пожалуйста, дайте мне знать, если это работает.

...