使用数据库中的数据填充 IAuthSession

2024-03-20

因此,我根据此处的示例使用 ServiceStack 创建了一个自定义 CredentialsAuthProvider:https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization

我的身份验证方面正在工作,但我不确定如何在身份验证方法中使用数据库中的数据填充会话。在示例中,它们显示了以下内容:

     //Fill the IAuthSession with data which you want to retrieve in the app eg:
    session.FirstName = "some_firstname_from_db"; 

在 TryAuthenticate 方法中,我有用户名/密码,可以使用它来根据数据库对用户进行身份验证,但是一旦进入 OnAuthenticated 方法,我该如何/使用什么来访问/检索数据库中的用户信息?


我知道这是一个较旧的线程,但它可能仍然相关,因为不幸的是,自 2012 年 9 月以来,在 ServiceStack 文档的可用性、示例的清晰度甚至代码中的注释方面没有太大改进。 (@mythz:如果你们可以为所有类和方法添加有意义的摘要,那将非常有帮助。)

我一直在同样的困境中挣扎,直到我查看了 CredentialsAuthProvider 的实际代码(这通常是理解 ServiceStack 中的工作原理的唯一方法)。 OnAuthenticated 在 Authenticate 方法内的 TryAuthenticate 之后立即调用,因此我认为没有必要像 @mythz 在他的示例中建议的那样在 OnAuthenticated 中进行所有数据库调用。相反,我将填充 IAuthSession 对象的代码直接放入 TryAuthenticate 的实现中,如下所示:

public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
    try
    {
        // Use my own repo to authenticate the user.
        var userRepo = authService.TryResolve<IUserRepository>();
        var user = userRepo.Authenticate(userName, password);

        // Populate session properties with data from my user POCO.
        var session = authService.GetSession();
        session.Id = user.CurrentSession.ID.ToString();
        session.IsAuthenticated = true;
        session.CreatedAt = DateTime.UtcNow;
        session.DisplayName = session.FirstName = session.LastName = user.FullName;
        session.UserAuthName = session.UserName = user.Username;
        session.UserAuthId = user.ID.ToString();
    }
    catch (Exception ex)
    {
        // Log the exception, etc....
        return false;
    }
    return true;
}

但是,您仍然必须重写 OnAuthenticated 以便将 cookie 保存在 HTTP 响应中(我认为这是来自同一浏览器的后续请求进行身份验证所必需的),因为基本实现仅在 IOC 容器中找到 IUserAuthRepository 时才设置 cookie ,在我的情况下不会发生,因为我使用自己的存储库。所以我的实现现在看起来像这样:

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
{
    try
    {
        // Save the browser cookie.
        var httpRes = authService.RequestContext.Get<IHttpResponse>();
        if (httpRes != null)
        {
            httpRes.Cookies.AddPermanentCookie(HttpHeaders.XUserAuthId, session.UserAuthId);
        }

        // Save the user session object (ServiceStack stores it in the in-memory cache).
        authService.SaveSession(session, SessionExpiry);
    }
    catch (Exception ex)
    {
        // Log the exception, etc....
    }
}

@mythz:请告诉我以上是否有道理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用数据库中的数据填充 IAuthSession 的相关文章

随机推荐

  • 将结果写入同一 Excel 文件中的 2 个不同工作表中

    你能教我Python是否可以写入同一个Excel文件 但2个不同的电子表格 选项卡 举例来说 我想挑选并写入以下4个网站的标题 并将它们写入同一个文件title xls中 但分别写入其Sheet1和Sheet 2中 www dailynew
  • jQuery - 从值数组中按值选择元素

    给出一些简单的 JSON 62689 62690 62697 我需要在 DOM 中选择与这些值相对应的三个元素 基于value属性 他们可能是一个
  • 处理存储在配置文件中的变量的最佳实践是什么?

    如果我使用配置文件来存储例如站点名称 数据库主机等 处理此问题的最佳实践是什么 sitename stackoverflow com 然后在函数中设置全局 sitename DEFINE SITENAME stackoverflow com
  • wxWidgets的EVT_CHAR_HOOK有什么作用?

    我正在维护一个 wxWidgets C 应用程序 它使用 EVT CHAR HOOK 来捕获高级窗口中的关键事件 我找不到此事件的任何真实文档 但我可以推测它以某种优先于 标准 关键事件的方式拦截关键事件 我刚刚发现的一件令人不安的事情是
  • Angular2 使用 ngFor 绑定数组

    我使用的是 angular2 在我的表单中 我通常创建一个模型类并将我的对象与表单绑定 然后通过 this myObject 进行访问 div class form group div
  • spring data redis主从配置

    以下是我的 jedis 配置 Bean public JedisConnectionFactory getJedisConnectionFactory JedisConnectionFactory jedisConnectionFactor
  • 从包含多个文档的语料库中删除行

    我的语料库中有 4000 个文本文档 作为数据清理的一部分 我想从每个文档中删除包含特定单词的行 例如 library tm doc corpus lt VCorpus DirSource C TextMining Prototype pa
  • iOS 13中的prefersStatusBar隐藏问题

    大家好 我想隐藏我的状态栏 in a View Controller但它似乎不起作用 我使用了该功能 override var prefersStatusBarHidden Bool return true 我还设置了View contro
  • Parse Javascript SDK -- 将客户端 `user` 保存为服务器端 ` Parse.User.current()`

    我可能在概念上做错了事情 所以请告诉我我是否错了 我正在使用 Parse 的 Facebook 登录来登录用户客户端 然后我尝试发布这个user object到我的服务器 这样我就可以在服务器端拥有该用户对象 但我在文档中找不到与此相关的任
  • xcode swift 如何分割图像?

    我正在使用 Swift 2 0 我想将图像分割成多个部分 我知道这是重复的 但它们的语法很旧 我在更新时遇到问题 update Xcode 8 2 1 斯威夫特 3 0 2 您可以添加此扩展来分割图像 extension UIImage v
  • ng 升级命令将 cli 从 v7 升级到 v8 失败

    用于将 cli 版本从 v7 项目更新到 v8 的 ng Upgrade 命令失败 首先手动尝试升级 cli 也会失败 ng update angular cli 您的全局 Angular CLI 版本 8 0 1 高于您的本地版本 版本
  • sklearn RandomForestClassifier 与 auc 方法中 ROC-AUC 分数的差异

    我分别从 sklearn 的 RandomForestClassifier 和 roc curve auc 方法收到不同的 ROC AUC 分数 以下代码得到了 0 878 的 ROC AUC 即 gs best score def tra
  • 斜杠和 python cmd

    我正在尝试使用 cmd 模块来实现 python cmd 我想自动完成文件 所以我实现了一些方法 但是 我看到 complete put self text line begidx endidx 中的文本参数删除了所有 字符 任何人都知道为
  • 如何将 AsParallel 与 async 和 wait 关键字一起使用?

    我正在查看某人的异步示例代码 并注意到其实现方式存在一些问题 在查看代码时 我想知道使用并行方式循环列表是否比正常循环列表更有效 据我所知 性能上的差异非常小 两者都耗尽了每个处理器 并且完成时间都相同 这是第一种方法 var tasks
  • 启动 python windows 服务可执行文件时出错

    我正在尝试按照指示创建一个 python windows 服务 https www thepythoncorner com 2018 08 how to create a windows service in python https ww
  • 如何增加/减少 x 和 y 刻度标签的字体大小[重复]

    这个问题在这里已经有答案了 我似乎在弄清楚如何增加或减少fontsize使用时的 x 和 y 刻度标签matplotlib 我知道有set xticklabels labels fontdict None minor False kwarg
  • sqlalchemy 连接失败但 cx_oracle 成功

    我正在尝试用 Python 连接到 Oracle 服务器 我在 cx Oracle 中可以正常工作 但是当我尝试使用 sqlalchemy 连接时 它失败了 cx Oracle代码 import cx Oracle import panda
  • 我应该如何使用tiny_mce_popup.js 更新 TinyMCE 插件版本 4?

    TinyMCE4 文档目前很糟糕 我有一个与 Ruby on Rails 兼容的插入图像插件 但它依赖于已弃用的tiny mce popup js 没有关于我应该如何更新插件以规避该文件的使用的信息 TinyMCE 4 弃用旧版本file
  • 删除大文件后 git Push

    我不小心提交了 log test log 但从未推送过它 从那以后我做了一个 git rm 来摆脱它 但是当我尝试推送时 我仍然收到大量数据试图传输 git rm 不应该解决这个问题吗 如果没有 我该如何修复它 不要恢复提交然后推送 因为大
  • 使用数据库中的数据填充 IAuthSession

    因此 我根据此处的示例使用 ServiceStack 创建了一个自定义 CredentialsAuthProvider https github com ServiceStack ServiceStack wiki Authenticati