我正在使用以下代码尝试在我的团队应用程序中获取用户令牌,配置了 SSO 并授予了管理员授权,因此用户看不到任何提示。调用此代码时:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
var userTokenClient = turnContext.TurnState.Get<UserTokenClient>();
var prompt = Activity.CreateMessageActivity();
var tokenResponse = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, null, cancellationToken).ConfigureAwait(false);
if (turnContext.Activity.Text.Equals("logout"))
{
await userTokenClient.SignOutUserAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, cancellationToken: cancellationToken);
await turnContext.SendActivityAsync(MessageFactory.Text("You have been signed out."), cancellationToken);
return;
}
if (tokenResponse == null)
{
var signInResource = await userTokenClient.GetSignInResourceAsync(_connectionName, (turnContext.Activity as Activity), "", cancellationToken).ConfigureAwait(false);
var value = signInResource.SignInLink;
prompt.Attachments.Add(new Attachment
{
ContentType = OAuthCard.ContentType,
Content = new OAuthCard
{
Text = "Test2",
ConnectionName = _connectionName,
Buttons = new[]
{
new CardAction
{
Title = "Test3",
Text = "Test1",
Type = ActionTypes.Signin,
Value = value
},
},
TokenExchangeResource = signInResource.TokenExchangeResource,
TokenPostResource = signInResource.TokenPostResource
},
});
await turnContext.SendActivityAsync(prompt, cancellationToken).ConfigureAwait(false);
var hebbenwetokenhier = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, null, cancellationToken).ConfigureAwait(false);
// This stays null
return;
}
// Other code here that uses the userToken
}
在变量
hebbenwetokenhier
中,我想获取用户令牌,因为用户没有看到任何提示,我不需要使用另一个提示吗?我能否确保收到OAuthCard发送结果后再次调用OnMessageActivity?或者是否有另一种方法可以在不使用对话框的情况下执行此操作。
当我运行此代码时,第一次输入
tokenResponse == null
检查,但运行 OAuthCard 一次后,用户已通过身份验证,我从第 5 行得到结果,现在我只想这样做,这样用户就不会必须发送两条消息!
您可以使用 OnInvokeActivityAsync 方法从 Teams 客户端接收调用活动。当用户与 OAuthCard 交互并完成令牌交换过程时调用此方法。然后您可以通过该方法获取用户令牌。
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
{
JObject value = JsonConvert.DeserializeObject<JObject>(turnContext.Activity.Value.ToString());
JObject authentication = null;
if (value["authentication"] != null)
{
authentication = JsonConvert.DeserializeObject<JObject>(value["authentication"].ToString());
var userTokenClient = turnContext.TurnState.Get<UserTokenClient>();
var tokenResponse = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, null, cancellationToken).ConfigureAwait(false);
if (tokenResponse != null)
{
// Use the user token here
}
}
return null;
}
OnInvokeActivityAsync 方法被重写以处理调用活动。身份验证对象是从活动值中提取的。如果认证对象不为空,则表示用户已经与OAuthCard进行了交互,并且完成了令牌交换过程。然后调用 GetUserTokenAsync 方法来获取用户令牌。