通过Web Api连接到DB的Asp.Net Identity

时间:2018-02-23 13:21:13

标签: c# asp.net asp.net-identity

我正在研究一个传统的MVC应用程序,该应用程序最初通过自定义类和实现进行表单身份验证。我修改了它并使用了Asp.Net Identity,它正如预期的那样工作。

我现在的要求是这个MVC应用程序不再应该直接访问数据库。所以我已经从web.config中删除了连接字符串,并且一直在寻找通过调用我的Web服务(Asp.Net Web Api)进行所有数据库调用。

我有自定义类:

  • UserStore
  • RoleStore

请注意我有一个自定义用户类,因为它是一个自定义用户表。

问题

1)实现目标的正确方法是什么?我可能会覆盖以前使用过IdentityDBContext的许多方法,例如:

public override Task<CustomUser> FindByIdAsync(int usrID)

public override Task<Customer> FindByNameAsync(string userName)

2)我找到了

  

FindByNameAsync()

正在按预期工作,并且用户正在传递给该方法但是FindByIdAsync()正在将userid传递为0.为什么FindByIdAsync()不会传递我的实际用户ID?

致电FindByIdAsync()我正在实施一个UserStore:

public class CustomUserStore : UserStore
    <
        CustomUser, 
        CustomRole, 
        int,
        CustomUserLogin, 
        CustomUserRole, 
        CustomUserClaim
    >
{

然后覆盖FindByIdAsync():

public override Task<CustomUser> FindByIdAsync(int usrID)
    {
        var response = client.GetAsync("api/user/" + usrID).Result.Content;
        return response.ReadAsAsync<CustomUser>(
             new List<MediaTypeFormatter> {
                new XmlMediaTypeFormatter(),
                new JsonMediaTypeFormatter()
            });
        //return base.FindByIdAsync(userId);
    }

问题是usrID为0。

1 个答案:

答案 0 :(得分:0)

我现在有这个工作,所以我的mvc应用程序正在使用AspNet.Identity但是对于所有数据库调用它正在调用我的api。解决方案确实是实现IUserStore(以及其他所需的接口),因此Internet上有很多答案和指南。一个很好的起点是:

https://docs.microsoft.com/en-us/aspnet/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity