Управление. Вызовите с входными Параметрами

Если вы получите токен в формате JSON Web Token (обычно его называют автономным токеном доступа) , то вы можете декодировать полезную нагрузку токена и получить имя пользователя. Обычно это может быть задано как субъектное («вспомогательное») утверждение или оно может быть отправлено в виде отдельного утверждения в JWT. Обратитесь по этой ссылке , чтобы понять о претензиях JWT.

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

Кроме того, вы можете переключиться на [ OpenID Connect ] (OIDC) 3 . Это будет включать идентификатор токена в ответе токена, который является JWT. Вы можете использовать это для получения имени пользователя (+ другая информация о пользователе) и аутентификации конечного пользователя в дополнение к проверке JWT. Проверьте, поддерживается ли OIDC вашим сервером авторизации.

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

13
задан Adam Haile 23 April 2009 в 23:10
поделиться

3 ответа

Which version of C# are you using? If you are using C#3.5 you can use closures to avoid passing in parameters.

With C#3.5
public static class ControlExtensions
{
  public static TResult InvokeEx<TControl, TResult>(this TControl control,
                                             Func<TControl, TResult> func)
    where TControl : Control
  {
    return control.InvokeRequired
            ? (TResult)control.Invoke(func, control)
            : func(control);
  }

  public static void InvokeEx<TControl>(this TControl control,
                                        Action<TControl> func)
    where TControl : Control
  {
    control.InvokeEx(c => { func(c); return c; });
  }

  public static void InvokeEx<TControl>(this TControl control, Action action)
    where TControl : Control
  {
    control.InvokeEx(c => action());
  }
}

Safely invoking code now becomes trivial.

this.InvokeEx(f => f.label1.Text = "Hello World");
this.InvokeEx(f => this.label1.Text = GetLabelText("HELLO_WORLD", var1));
this.InvokeEx(() => this.label1.Text = DateTime.Now.ToString());

With C#2.0 it becomes less trivial
public class MyForm : Form
{
  private delegate void UpdateControlTextCallback(Control control, string text);
  public void UpdateControlText(Control control, string text)
  {
    if (control.InvokeRequired)
    {
      control.Invoke(new UpdateControlTextCallback(UpdateControlText), control, text);
    }
    else
    {
      control.Text = text;
    }
  }
}

Using it simple, but you have to define more callbacks for more parameters.

this.UpdateControlText(label1, "Hello world");
22
ответ дан 1 December 2019 в 19:15
поделиться

Как говорит Люк, используйте Control.Invoke вот так ...

Например, в форме:

public delegate void DelegatePassMessages(string name, int value);

public DelegatePassMessages passMessage;

В конструкторе:

passMessage = new DelegatePassMessages (this.MessagesIn);

Затем функция MessagesIn для получения данных:

public void MessagesIn(string name, int value)
{

}

Затем, чтобы передать данные в форму:

formName.Invoke(formName.passMessage, new Object[] { param1, param2});
6
ответ дан 1 December 2019 в 19:15
поделиться

Я думаю, что подход Самуэля (отличный) можно продвинуть еще больше:

Метод расширения:

public static void ExecuteAsync<TControl>(this TControl control, Action action)
where TControl : Control
{
  new Thread(() =>
  {
    control.Invoke(action);
  })
  .Start();
}

Код формы:

private void doStuff()
{
  this.ExecuteAsync(() =>
  {
    // Do your stuff in a separate thread
    // but having full access to local or instance variables.

    // No (visible) threading code needs to be used here.
  });
}
1
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: