Можно ли передать пользовательский параметр на сервер идентификации при обновлении / обновлении токена?
В моем случае у меня есть 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, который создает сервер идентификации.
Надеюсь, я хорошо себя объяснил, и вы мне можете помочь, большое спасибо!