【问题标题】:Retrieve UserID from AuthenticationStateProvider从 AuthenticationStateProvider 中检索 UserID
【发布时间】:2021-11-26 07:30:14
【问题描述】:

我正在创建一个待办事项,其中创建时的每个项目都属于特定用户。我将 AspNetCore 身份与表 AspNetUsers 一起使用。我试图在 OnInitializedAsync 方法中获取当前用户的 ID。我遇到了一个小问题。我在另一篇文章中发现 FirstOrDefault().Value 将返回用户 ID,但是,由于我的用户模型使用 GUID 作为用户 ID 而 AspNetCore.Identity 没有,我遇到了如何更改 AspNetCore 的问题。将用户 ID 标识为 GUID。其他表依赖于为 UserID 设置的 GUID 类型(迁移会出现此错误),因此我无法更改它。但是,这也可能不是正确的方法。我想知道如何正确检索 UserID?

@inject AuthenticationStateProvider GetAuthenticationStateAsync

private Todo todoItem { get; set; } = new Todo ();

protected override async Task OnInitializedAsync()
{
    todoItem.owningUser = new User();
    var authstate = await GetAuthenticationStateAsync.GetAuthenticationStateAsync();
    var user = authstate.User;
    var id = user.Claims.FirstOrDefault().Value;
    todoItem.owningUser.UserId = Guid.Parse(id); // did not work
}

【问题讨论】:

  • 你有可能设计你的桌子吗?
  • AspNetUsers 是生成的表,但 Blazor 模板
  • 它给你什么样的输出,你期待什么样的输出?如果您将所有内容都设置为 GUID 类型,那么您不应该真正遇到问题。
  • 我认为 AspNetUsers 表使用的是字符串而不是 GUID。我不确定如何将 AspNetUsers 表更改为也使用 GUID
  • 在这种情况下,如前所述,如果您有权访问您的 SQL 表,只需更改您表中的数据类型。应用迁移时,您可能不小心做错了什么。

标签: c# asp.net-core blazor blazor-webassembly


【解决方案1】:

你应该设置一个断点来浏览 VS 中的用户对象。然后你可以看到那里有什么声明,它们被称为什么等等。如果你使用标准身份,那么以下应该可以工作:

@inject AuthenticationStateProvider ASP

@code {
    protected override async Task OnInitializedAsync()
    {
        var user = (await ASP.GetAuthenticationStateAsync()).User;
        var UserStringId = user.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
        todoItem.owningUser.UserId = Guid.Parse(UserStringId);
    }
}

【讨论】:

  • 谢谢。如果我的 UserDTO 模型使用来自唯一标识的 GUID id 并且 .Value 返回一个字符串。我该怎么做: todoItem.owningUser.UserId = UserId; ?我收到一条错误消息,提示无法将类型字符串转换为 Guid;理所当然地。有关如何处理此问题的任何建议?
  • 要么将字符串转换为 Guid,要么将 Guid 转换为字符串以进行比较?不确定哪个处理器时间更便宜。
  • 我认为 @Krellex var UserGuid = Guid.Parse(UserId); 应该这样做。我将编辑我的答案。 C# 有很好的文档,如果你在谷歌上搜索“C# 将字符串转换为 Guid”,你应该会得到一些乐趣。但是,我只会在 todoItem.owningUser.UserId 字段本身中使用 string 而不是 Guid,因为 Blazor 的默认身份系统无论如何都使用 string
  • Guid.Parse 似乎对我不起作用,不断向我抛出无法正确转换的错误。我认为 AspNetUsers 中的字符串没有正确映射到导致错误的 GUID。
  • AspNetUsers Id 字段在 SQL 中默认存储为 nvarchar(450),它是一个字符串。但默认情况下,它是一个 Guid,并且会这样解析。当您在转换线设置断点时,id 中的确切值是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多