Отправка пользовательского параметра в IdentityServer при обновлении токена - PullRequest
0 голосов
/ 29 апреля 2020

Можно ли передать пользовательский параметр на сервер идентификации при обновлении / обновлении токена?

В моем случае у меня есть identityserver4 и клиент Angular с oid c -клиентской платформой, где клиент регистрируется с использованием идентификатора, используя поток кода с PKCE из OAuth2 и OpenIdConnect.

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

В тот момент, когда клиент входит в систему с идентификационными данными, вводя свои учетные данные, он передает компанию из клиента Angular следующим образом:

  private _authNavStatusSource = new BehaviorSubject<boolean>(false);

  authNavStatus$ = this._authNavStatusSource.asObservable();

  private manager = new UserManager(getClientSettings());
  user: User | null;

  public httpOptions;

  constructor(private http: HttpClient, private configService: ConfigService) {
    super();

    this.manager.getUser().then(user => {
      this.user = user;
      this._authNavStatusSource.next(this.isAuthenticated());
    });

    this.manager.events.addUserLoaded(user => {
      this.user = user;
    });

    this.subscribeevents();

  }

  login(company: string) {
    this.manager.settings.extraQueryParams = {companyCode: company};
    return this.manager.signinRedirect();
  }

  async completeAuthentication() {
      this.user = await this.manager.signinRedirectCallback();
      this._authNavStatusSource.next(this.isAuthenticated());
      console.log('Login complete');
  }

...

  async signout() {
    await this.manager.signoutRedirect();
  }

Таким образом, в Identity Server AccountController у меня есть доступ к этому параметру из:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model, string button)
{

var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);

…

Claim[] additionalLocalClaims =
    {
       new Claim("companyCode", context.Parameters["companyCode"])
    };

var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);

Claim[] additionalLocalClaims =
    {
       new Claim("companyCode", context.Parameters["companyCode"])
    };

…
await HttpContext.SignInAsync(user.SubjectId, user.UserName, props,additionalLocalClaims);

Затем я добавляю это утверждение с чтобы сделать его доступным в моей CustomProfileConfiguration

Таким образом, из CustomProfileConfiguration у меня есть доступ к компания и может получить роли этого пользователя в этой компании.

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
    var companyCode = context.Subject.Claims.FirstOrDefault(c => c.Type == "companyCode");

Проблема возникает, когда пользователь меняет компанию, и необходимо обновить токен, чтобы взять на себя новые роли для новой компании.

Если следующий метод signout() выполняется на стороне клиента, пользователь полностью вышел из системы и для входа в другую компанию ему необходимо повторно ввести учетные данные (которые будут теми же, которые он уже ввел). ).

Задача состояла бы в том, чтобы обновить sh токен путем передачи новой компании на сервер идентификации без необходимости повторного ввода учетных данных с помощью ключа ie, который создает сервер идентификации.

Надеюсь, я хорошо себя объяснил, и вы мне можете помочь, большое спасибо!

...