Web Api用户跟踪

本文关键字:跟踪 用户 Api Web | 更新日期: 2023-09-27 17:50:23

我需要Web Api的帮助。

我正在建立一个多租户系统时,每个租户都有自己的数据数据库使用代码首先EF和web api(这样我就可以创建多个应用程序平台)

我扩展了标准的ASP。. NET Identity包含客户端id和客户端模型,它们将存储所有租户及其用户。

然后我创建了另一个上下文,它跟踪每个租户存储的所有数据。

每个租户都拥有一个数据库名称,我需要根据经过身份验证的用户访问该数据库名称。

不从每个api控制器获取用户id似乎很容易:

RequestContext.Principal……等,然后我可以得到客户端和随后的客户端数据库名称传递到数据库上下文然而,我正试图实现一个标准的数据存储库模式,真的讨厌重复自己的代码,但我看到它目前工作的唯一方法是:

应用程序在授权后调用restful apiWeb Api捕获调用每个端点获取用户id,并通过接口将其传递给数据存储,随后传递到数据层,为上下文检索数据库名称。

我在这里遇到的问题是每个端点获取用户id。是否有一种方法来"存储/跟踪"每个会话的用户id ?这可以通过作用域依赖或类似的方法来实现吗?

我希望这是有意义的,但如果不是,请问,我会尽量进一步澄清,任何帮助将非常感激。

感谢卡尔

Web Api用户跟踪

ASP WebApi没有会话上下文。您可以使用cookie或请求令牌标识符(从登录传递此令牌并将此令牌用作进一步API调用的参数)。

这是我一段时间前开发的东西。我只是创建一个从ApiController派生的新类,我使用这个类作为所有其他API类的基础。它使用的是ASP。. NET缓存对象,可以通过HttpContext访问。我使用当前的用户id作为参考。如果您需要其他东西,您可以使用另一种方式缓存数据:

public abstract class BaseController: ApiController
{
    private readonly object _lock = new object();
    /// <summary>
    /// The customer this controller is referencing to.
    /// </summary>
    protected Guid CustomerId
    {
        get
        {
            if (!_customerId.HasValue)
            {
                InitApi();
                lock (_lock)
                {
                    if (User.Identity.IsAuthenticated)
                    {
                        Guid? customerId = HttpContext.Current.Cache["APIID" + User.Identity.Name] as Guid?;
                        if (customerId.HasValue)
                        {
                            CustomerId = customerId.Value;
                        }
                        else
                        {
                            UserProfile user = UserManager.FindByName(User.Identity.Name);
                            if (user != null)
                            {
                                CustomerId = user.CustomerId;
                                HttpContext.Current.Cache["APIID" + User.Identity.Name] = user.CustomerId;
                            }
                        }
                    }
                    else
                    {
                        _customerId = Guid.Empty;
                    }
                }
            }
            return _customerId.GetValueOrDefault();
        }
        private set { _customerId = value; }
    }
// ... more code
}

不要怪我的"锁"的东西。这段代码有点像"让它启动并运行,然后忘记它"…

也许我说的不是真的,但是Web API的状态更少,所以你没有真正的会话来跟踪