Авторизация на основе политик с Angular и ASP. NET Core с использованием Active Directory - PullRequest
0 голосов
/ 18 марта 2020

Я занимаюсь разработкой приложения intr anet

Backend :. NET Core Web API-2 Frontend : Angular 4 +

Для бэкэнда я использовал Windows Авторизация на основе политик, и я получаю всю информацию для авторизации из Active Directory. См. Ниже код:

Мой Обработчик авторизации

public class BranchUserHandler : AuthorizationHandler<BranchUserRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BranchUserRequirement requirement)
        {
            string userCPNumber = context.User.Identity.Name;

            using (var ctx = new PrincipalContext(ContextType.Domain, "CAPITECBANK"))
            {
                UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userCPNumber);
                if (user == null)
                {
                    return Task.CompletedTask;
                }
                else
                {
                    string userCompany = user.GetCompany();
                    if (requirement.Company == userCompany)
                    {
                        string userDepartment = user.GetDepartment();
                        if (requirement.Department == user.GetDepartment())
                        {
                            string userDescription = user.GetDescription();
                            if (requirement.Description == userDescription)
                            {
                                string userTitle = user.GetTitle();
                                if (requirement.Title.Contains(userTitle))
                                {
                                    context.Succeed(requirement);
                                }
                            }
                        }

                    }
                }
            }
                return Task.CompletedTask;
        }
    }

Запуск

public void ConfigureServices(IServiceCollection services)
        {


            services.ConfigureRepositoryContext(Configuration);
            services.configureRepositoryWrapper();
            services.AddCors(options => 
            {
            options.AddPolicy("CorsPolicy",
                builder => builder.WithOrigins("http://localhost:62000")
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
            });
            services.ConfigureSwagger();
            services.AddAutoMapper(typeof(Startup));

            services.Configure<IISOptions>(options =>
            {
                options.AutomaticAuthentication = true;
            });



            services.AddAuthorization(options =>
            {
                options.AddPolicy("WorksInBranch", policy => policy.Requirements.Add(new BranchUserRequirement("Information Technology", 
                    "Systems Development - Revenue & Products", "SYSTEM DEVELOPMENT", 
                    new List<string>{"Regional Manager", "Branch Manager", "Assistant Branch Manager",
                        "ATM Assistant", "Service Consultant", "Sales Consultant", "Junior Support Analyst: Card Processing Channels"})));

            });
            services.AddSingleton<IAuthorizationHandler, BranchUserHandler>();
            services.AddAuthentication(IISDefaults.AuthenticationScheme);
            services.AddMvc()
                .AddJsonOptions(
                    options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
                    );
            //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

Итак, на Angular frontend, я хочу, чтобы пользователь автоматически авторизировался, если пользователь в данный момент вошел в систему на своем компьютере windows, т.е. пользователю не нужно вводить учетные данные, если пользователь вошел в систему на своем компьютере windows.

Обратите внимание, что у меня есть два отдельных проекта для веб-API и для клиентской части.

Я осмотрелся, но ничего не помогло. Кто-нибудь может мне помочь?

Заранее спасибо

1 Ответ

0 голосов
/ 18 марта 2020

У меня была такая же проблема для одного из моих проектов.

Решение, которое я дал этой проблеме, заключалось в использовании файлов cookie и BehaviourSubject.

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

Когда приложение Angular загружается после закрытия,

мы проверяем, есть ли у нас данные, сохраненные в файлах cookie,

, если true, мы проверяем, являются ли файлы cookie действительными,

если снова значение true, мы разрешаем пользователю взаимодействовать с приложением

Если файлы cookie или файлы cookie недействительны, мы перенаправляем его на страницу входа.

При выходе из системы мы очистить куки и установить для пользователя значение NULL

Пример кода

  private user: BehaviorSubject<User> = new BehaviorSubject<User>(this.userCookies());
  public user$: Observable<User> = this.user.asObservable();


  userCookies(): User | null {
    const local = this.cookieService.get('userData');
    if (local) {
      return JSON.parse(local);
    }
    return null;
  }

  setUserCookie(user: User) {
    this.cookieService.set('userData', JSON.stringify(user));
  }

  login(payload) {
    return this.loginRequest(loginData).pipe(
      // login successful if there's a token in the response
      tap(data => {
        if (data && data.token) {
          this.setUserCookie(data);
          this.user.next(data);
          this.router.navigate([ '/' ]);
        } else if (data.error) {
          this.user.next(null);
        }
      }));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...