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?的主要内容,如果未能解决你的问题,请参考以下文章