FluentValidation/MVC/ASP Identity:验证模型时如何获取当前用户 ID?
Posted
技术标签:
【中文标题】FluentValidation/MVC/ASP Identity:验证模型时如何获取当前用户 ID?【英文标题】:FluentValidation/MVC/ASP Identity: How to get the current user Id when validating model? 【发布时间】:2014-04-03 09:02:19 【问题描述】:1) 我正在尝试允许用户在 ASP.MVC/Identity 应用程序中更改其用户名(电子邮件)等。使用 FluentValidation 我想检查没有其他用户正在使用新电子邮件。
在控制器中我会使用 User.Identity.GetUserId() 但这在构建验证规则时不可用。如何检索当前已通过身份验证的 userId?
public class ManageUserViewModelValidator : AbstractValidator<ManageUserViewModel>
public ManageUserViewModelValidator()
RuleFor(e => e.UserName)
.NotEmpty()
.WithMessage("Måste ange din e-post adress.")
.EmailAddress()
.WithMessage("Ogiltig e-post adress.")
.Must((model, _) => UserMethods.IsUserNameAvailable(model.UserName, "userId???"))
.WithMessage("E-post adressen är upptagen.");
...
[FluentValidation.Attributes.Validator(typeof(ManageUserViewModelValidator))]
public class ManageUserViewModel
[Display(Name = "E-post*")]
public string UserName get; set;
...
2) 存储此类更改的最佳方式是什么。现在我正在使用 AutoMapper:
public static void Update(this DbContext context, ManageUserViewModel model, string userId)
User user = context.Users.FirstOrDefault(e => e.Id.Equals(userId));
Mapper.CreateMap<ManageUserViewModel, TessinUser>();
Mapper.Map(model, user);
context.SaveChanges();
3) 在我的标题中,我使用User.Identity.GetUserName()
显示当前登录的用户,但是在我更改了用户名之后,此文本没有更新。我需要注销并再次登录才能更新。有没有办法让 ASP 更新当前用户?
【问题讨论】:
【参考方案1】:1) 我正在尝试允许用户在 ASP.MVC/Identity 应用程序中更改其用户名(电子邮件)等
Asp.net 身份有一个名为UserManager 的类。这个类公开了很多函数,包括Update,它会自动更新用户在UserStore中的数据。
使用 FluentValidation 我想检查没有其他用户正在使用新电子邮件。
如果您使用 UserManager 类的 Create 函数来创建新用户,则此函数会自动处理重复的用户名条目验证。如果输入无效或重复,Create 函数会返回描述性很好的错误消息,您可以将这些消息显示给您的用户。
2) 存储此类更改的最佳方式是什么。现在我正在使用 AutoMapper:
我不明白您在 2 点中提到的代码。 Automapper 的唯一目的是将一个对象映射到另一个对象。在那个代码中
您从数据库中获取用户 创建一个映射配置(你应该只做一次,不需要一次又一次地创建映射配置。所以这种类型的东西最好的地方是 global.asax 文件) 然后您将视图模型对象映射到域模型对象。但是这个东西从来没有对当前上下文进行任何改变,所以context.SaveChanges()没有任何作用。
我认为这就是您的 User.Identity.GetUserName() 未更新的原因。
【讨论】:
谢谢,我会试试 Update() 可能会解决我所有的问题。感谢您阐明映射配置的放置位置。 我已经使用 UpdateAsync 完成了所有步骤,但我的 User.Identity.GetUserName() 没有更新?这可以以某种方式强制吗? 您是否使用 ajax 更新用户? 不使用后端控制器。 好的,但我的意思是说您通过哪种方式将请求发送到控制器,ajax 请求或表单发布?因为如果它是一个ajax而不是用户名文本不会更新,你必须手动更新文本用户名以上是关于FluentValidation/MVC/ASP Identity:验证模型时如何获取当前用户 ID?的主要内容,如果未能解决你的问题,请参考以下文章