You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取IFrame嵌入Bot的宿主网站状态及登录用户数据?

Hey there! Let's tackle your two requirements step by step, with practical implementations using Bot Framework—since you mentioned seeing similar bots in the industry, these are the standard approaches folks use:

1. 获取当前托管网站的登录用户数据

When your bot is hosted alongside your website (or integrated via Web Chat), you can pass authenticated user data directly during the bot's initialization. Here's how:

  • Web Chat Initialization with User Data:
    If you're using the official Web Chat component, inject user information when setting up the chat widget. For example, if your website already has the logged-in user's ID and details, pass them into the Web Chat configuration:

    // On your website's frontend
    const directLine = window.WebChat.createDirectLine({ token: 'YOUR_DIRECT_LINE_TOKEN' });
    
    window.WebChat.renderWebChat({
      directLine: directLine,
      userID: 'LOGGED_IN_USER_ID', // Pass the authenticated user's ID here
      username: 'USER_DISPLAY_NAME',
      // Add custom data via channelData for extra details
      channelData: {
        accountId: 'USER_ACCOUNT_ID',
        userRole: 'admin' // Any other relevant user info
      }
    }, document.getElementById('webchat'));
    
  • Receiving Data in the Bot:
    On the bot side, access this data from the incoming Activity object. In your bot's turn handler:

    // C# example
    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        // Get user ID from Activity.From.Id
        var userId = turnContext.Activity.From.Id;
        
        // Extract custom channel data
        if (turnContext.Activity.ChannelData != null)
        {
            var channelData = JObject.FromObject(turnContext.Activity.ChannelData);
            var accountId = channelData["accountId"]?.ToString();
            var userRole = channelData["userRole"]?.ToString();
            
            // Store data in user state for persistent access
            var userStateAccessor = _userState.CreateProperty<UserData>(nameof(UserData));
            var userData = await userStateAccessor.GetAsync(turnContext, () => new UserData());
            userData.AccountId = accountId;
            await _userState.SaveChangesAsync(turnContext, false, cancellationToken);
        }
        
        // Use the data to personalize the bot's response
        await turnContext.SendActivityAsync(MessageFactory.Text($"Welcome back, {userId}! We have your account ID on file."), cancellationToken);
    }
    
2. 获取IFrame嵌入宿主网站的状态并传递用户凭证

When embedding your bot via IFrame, cross-domain communication is the core challenge. You'll use the browser's postMessage API to send data from the host website to the IFrame, then pass that data to the bot as a custom event.

Step 1: Host Website Sends User Data to IFrame

On your host website (the one embedding the IFrame), add code to send logged-in user details once the IFrame loads:

// Host website code
const botIframe = document.getElementById('bot-iframe');

botIframe.addEventListener('load', () => {
    const userAuthData = {
        type: 'user-authentication',
        userId: 'LOGGED_IN_USER_ID',
        accountId: 'USER_ACCOUNT_ID',
        isLoggedIn: true
    };
    
    // Send message to the IFrame (restrict to your bot's domain for security)
    botIframe.contentWindow.postMessage(userAuthData, 'https://your-bot-domain.com');
});

Step 2: IFrame Listens for Messages and Passes to Bot

Inside the IFrame (your bot's web page hosting Web Chat), catch the host's message and dispatch it to the bot as a custom event:

// IFrame (bot's web page) code
window.addEventListener('message', (event) => {
    // Verify the message comes from a trusted host domain
    if (event.origin !== 'https://your-host-domain.com') return;
    
    const message = event.data;
    if (message.type === 'user-authentication') {
        // Create a Web Chat store to send the custom event to the bot
        const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
            if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
                dispatch({
                    type: 'WEB_CHAT/SEND_EVENT',
                    payload: {
                        name: 'userAuthenticated',
                        value: {
                            userId: message.userId,
                            accountId: message.accountId,
                            isLoggedIn: message.isLoggedIn
                        }
                    }
                });
            }
            return next(action);
        });
        
        // Render Web Chat with the store to trigger the event
        const directLine = window.WebChat.createDirectLine({ token: 'YOUR_DIRECT_LINE_TOKEN' });
        window.WebChat.renderWebChat({ directLine, store }, document.getElementById('webchat'));
    }
});

Step 3: Bot Handles the Custom Authentication Event

In your bot, add logic to listen for the userAuthenticated event, store the data, and adjust the flow based on login state:

// Node.js bot example
this.onEvent(async (context, next) => {
    if (context.activity.name === 'userAuthenticated') {
        const userData = context.activity.value;
        
        // Save data to user state
        const userProfile = await this.userProfileAccessor.get(context, {});
        userProfile.accountId = userData.accountId;
        userProfile.isLoggedIn = userData.isLoggedIn;
        await this.userState.saveChanges(context);
        
        // Customize bot behavior based on login status
        if (userData.isLoggedIn) {
            await context.sendActivity(`Welcome back! Your account ID is ${userData.accountId}. Here are your personalized options:`);
            // Show authenticated-only features (e.g., account management, order history)
        } else {
            await context.sendActivity('Looks like you\'re not logged in. Please log in to access personalized features.');
            // Show public-facing options or a login prompt
        }
    }
    await next();
});

Key Security & Best Practices:

  • Always validate event.origin in postMessage to block messages from untrusted domains.
  • Use Bot Framework's UserState to persist user data across conversation turns, so you don't need to re-send it repeatedly.
  • Add fallback logic in the bot (e.g., prompting for user info) if the host website fails to send authentication data.

内容的提问来源于stack exchange,提问作者user8321763

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:26