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

如何在带O365认证的WebForms站点获取登录用户邮箱并实现个性化展示?

Hey there! Since you've already got your O365 authentication up and running via Visual Studio's built-in setup, grabbing the logged-in user's email and customizing content based on that is straightforward. Let's walk through how to do this:

获取登录用户的邮箱地址

When using O365 authentication in WebForms, the user's identity data is stored in a ClaimsPrincipal object. The email address is typically available as a claim—you can retrieve it in your page's code-behind (.aspx.cs) like this:

using System.Security.Claims;
using System;

protected void Page_Load(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        // First try the standard Email claim type
        var emailClaim = ((ClaimsPrincipal)User).FindFirst(ClaimTypes.Email);
        string userEmail = null;

        if (emailClaim != null)
        {
            userEmail = emailClaim.Value;
        }
        // Fallback to "preferred_username" (O365 sometimes uses this for emails)
        else
        {
            var preferredNameClaim = ((ClaimsPrincipal)User).FindFirst("preferred_username");
            if (preferredNameClaim != null)
            {
                userEmail = preferredNameClaim.Value;
            }
        }

        if (!string.IsNullOrEmpty(userEmail))
        {
            // Store the email for later use (e.g., in ViewState) or display it
            ViewState["UserEmail"] = userEmail;
            lblUserEmail.Text = $"Logged in as: {userEmail}";
        }
    }
}
根据用户邮箱展示不同内容

Once you have the user's email, you can customize content in two main ways:

1. 后端代码控制(Code-Behind)

Use server-side logic to show/hide controls or redirect users based on their email:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack && User.Identity.IsAuthenticated)
    {
        var emailClaim = ((ClaimsPrincipal)User).FindFirst(ClaimTypes.Email);
        if (emailClaim != null)
        {
            string userEmail = emailClaim.Value;

            // Show admin-only link for specific email
            if (userEmail.Equals("admin@yourdomain.com", StringComparison.OrdinalIgnoreCase))
            {
                lnkAdminPanel.Visible = true;
                lnkUserDashboard.Visible = false;
            }
            else
            {
                lnkAdminPanel.Visible = false;
                lnkUserDashboard.Visible = true;
            }

            // Redirect VIP users to their exclusive page
            if (userEmail.Equals("vip@yourdomain.com", StringComparison.OrdinalIgnoreCase))
            {
                Response.Redirect("~/VipExclusive.aspx");
            }
        }
    }
}

In your .aspx markup, add the relevant controls:

<asp:HyperLink ID="lnkAdminPanel" runat="server" NavigateUrl="~/AdminPanel.aspx" Text="Admin Panel" Visible="False"></asp:HyperLink>
<asp:HyperLink ID="lnkUserDashboard" runat="server" NavigateUrl="~/UserDashboard.aspx" Text="User Dashboard"></asp:HyperLink>

2. 前端直接绑定

You can also use inline ASP.NET syntax to conditionally render content directly in your .aspx page:

<% if (User.Identity.IsAuthenticated) { %>
    <% 
        var emailClaim = ((System.Security.Claims.ClaimsPrincipal)User).FindFirst(System.Security.Claims.ClaimTypes.Email);
        string userEmail = emailClaim?.Value;
    %>
    <% if (!string.IsNullOrEmpty(userEmail) && userEmail.Equals("admin@yourdomain.com", StringComparison.OrdinalIgnoreCase)) { %>
        <a href="~/AdminPanel.aspx" class="admin-link">Admin Panel</a>
    <% } else { %>
        <a href="~/UserDashboard.aspx" class="user-link">User Dashboard</a>
    <% } %>
<% } %>
关键注意事项
  • 检查O365权限: 确保你的Azure AD应用注册拥有User.Read权限(Visual Studio通常会默认添加,但如果无法获取邮箱Claim,需要在Azure门户中验证并授予管理员同意)。
  • 避免空引用异常: 始终为Claim添加空值检查——少数情况下用户的邮箱Claim可能未被填充。
  • 用角色扩展管理: 对于大型应用,不要硬编码邮箱地址,建议将用户角色存储在与邮箱关联的数据库中,通过角色控制内容访问,这样更易于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:25:23