获取身份验证中当前用户的电子邮件

8

我使用 IIdentity 接口来获取当前的 useridusername

因此,实现以下方法:

private static IIdentity GetIdentity()
{
    if (HttpContext.Current != null && HttpContext.Current.User != null)
    {
        return HttpContext.Current.User.Identity;
    }

    return ClaimsPrincipal.Current != null ? ClaimsPrincipal.Current.Identity : null;
}

在我的IoC容器[structuremap]中,添加以下代码:_.For<IIdentity>().Use(() => GetIdentity()); 使用方法
this._identity.GetUserId();
this._identity.GetUserName();
this._identity.IsAuthenticated

现在我想要实现GetEmailAdress方法,怎么做呢?

示例

this._identity.GetEmailAdress();

当使用 this._identity.GetUserName(); 时,不要从数据库中获取用户名。


电子邮件是用户资料中的数据,而不是他的身份。您需要获取当前用户的资料对象,然后检索他的电子邮件。 - Panagiotis Kanavos
3个回答

7
您可以按照以下方式进行操作:

您可以这样做:

public static class IdentityExtensions
{
    public static string GetEmailAdress(this IIdentity identity)
    {
        var userId = identity.GetUserId();
        using (var context = new DbContext())
        {
            var user = context.Users.FirstOrDefault(u => u.Id == userId);
            return user.Email;
        }
    }        
}

然后您就可以像这样访问它:

this._identity.GetEmailAdress();

当使用 this._identity.GetUserName(); 时,不要从数据库获取用户名。 - Soheil Alizadeh
2
是的,因为用户名是您的主体的一部分,但电子邮件不是。除非您在应用程序中使用声明,否则必须从数据库获取电子邮件。如果使用声明,则可以在验证用户时将其设置在声明中,稍后从声明中读取它。 - Jinish
好的,你可以向我展示如何做这个或编辑你的答案吗? - Soheil Alizadeh
@SoheilAlizadeh,答案已经表明了。用户的身份与其个人资料属性是不同的。您无法从身份中获取电子邮件,就像无法从护照或驾驶执照中获取您的电子邮件一样。有些网站使用电子邮件地址作为用户名。但是,他们仍然允许您更改联系电子邮件,而不更改用户名。 - Panagiotis Kanavos

5
您可以按照以下方式获取ASP.NET Identity中的当前用户:
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext()
    .GetUserManager<ApplicationUserManager>()
    .FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

//If you use int instead of string for primary key, use this:
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext()
    .GetUserManager<ApplicationUserManager>()
    .FindById(Convert.ToInt32(System.Web.HttpContext.Current.User.Identity.GetUserId()));

ApplicationUser user = UserManager.FindByName(userName);
string mail= user.Email;

谢谢,@MuratYıldız。我使用 ASP.NET Identity 但是我想像 this._identity.GetUserName(); 这样的方式获取 EmailAdress,而不是从数据库中获取。 - Soheil Alizadeh
@SoheilAlizadeh,你能否尝试使用我回答中提供的相关代码行更新已实现的方法?也许这样可以解决问题,让你成功地使用已实现的方法。 - Murat Yıldız
1
我认为可以通过索赔来解决这个问题。 - Soheil Alizadeh
2
@SoheilAlizadeh,用户的姓名是一回事,用户的电子邮件是另一回事。您无法从身份获取个人资料信息,这就像要求从护照、身份证或驾驶执照中获取某人的电子邮件一样。这里没有什么需要修复的 - 声明仍然是身份的一种形式。此外,您可以将一个电子邮件地址作为用户名,将另一个电子邮件地址作为联系电子邮件。 - Panagiotis Kanavos

0

主控制器

 [AllowAnonymous]
        public ActionResult GetUserEmail()
        {
            try
            {
                var userID = User.Identity.GetUserId();
                ViewBag.EmailData = db.AspNetUsers.Where(s => s.Id == userID).Select(x => x.Email).FirstOrDefault().ToString();
                return Content(ViewBag.EmailData);
            }
            catch
            {
                return null;
            }
        }

在视图中

@{
string USREmail = Html.Action("GetUserEmail", "Home").ToString();
}

您可以展示电子邮件

@USREmail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接