【问题标题】:ServiceStack - IAuthRepository vs IUserAuthRepositoryServiceStack - IAuthRepository 与 IUserAuthRepository
【发布时间】:2022-02-18 12:10:05
【问题描述】:

我必须将我的 Web 应用程序配置为使用 ServiceStack 内置的 ApiKeyAuthProvider。我已经在容器中注册了带有 IAuthRepository 接口的 OrmLiteAuthRepository,但是它抛出了一个异常,说我没有注册 IUserAuthRepository。 有人可以解释我的区别吗? 提前致谢

编辑: 对不起,我弄糊涂了 错误是

System.NotSupportedException: 'ApiKeyAuthProvider requires a registered IAuthRepository'

我们AppHost的Configure方法是

    public override void Configure(Container container)
    {
        var dbFactory = new OrmLiteConnectionFactory("connString", SqlServerDialect.Provider);
        container.Register<IDbConnectionFactory>(dbFactory);
        container.Register<IUserAuthRepository>(_ => new OrmLiteAuthRepository(dbFactory));
        container.Resolve<IUserAuthRepository>().InitSchema();

        var authProvider = new ApiKeyAuthProvider()
        {
            RequireSecureConnection = false
        };

        Plugins.Add(new AuthFeature(
            () => new AuthUserSession(),
            new IAuthProvider[] {
                authProvider
            }
        ));
    }

你能解释一下这两个接口之间的区别吗?我们无法弄清楚(ServiceStack v.6.0.2)

【问题讨论】:

  • 这听起来不对,请提供您的注册码和完整的 Exception StackTrace 以及您正在使用的 ServiceStack 版本。
  • @mythz 应要求,再次感谢

标签: asp.net-core asp.net-core-mvc servicestack


【解决方案1】:

正确用法示例请参考Auth Repository docs,例如:

container.Register<IDbConnectionFactory>(c =>
    new OrmLiteConnectionFactory(connectionString, SqlServer2012Dialect.Provider));

container.Register<IAuthRepository>(c =>
    new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>()));

container.Resolve<IAuthRepository>().InitSchema();

IAuthRepository 是所有 Auth Repositories 必须实现的最小接口,而 IUserAuthRepository 是扩展接口,用于启用扩展功能以启用所有 ServiceStack 内置 Auth Repositories 也实现的附加功能。但是您永远不需要注册或解析 IUserAuthRepository,即它们应该只针对主要的 IAuthRepository 接口注册。

解析 Auth 存储库

如果您需要,可以从服务中的base.AuthRepositorybase.AuthRepositoryAsync 访问身份验证存储库,您可以在其中使用任何IUserAuthRepository API,因为它们都可以作为@987654332 上的扩展方法使用@,例如此示例服务调用IUserAuthRepository.GetUserAuth() 方法:

public class MyServices : Service
{
    public object Get(MyRequest request) => 
        AuthRepository.GetUserAuth(request.UserId);
}

以下是推荐的 API,用于在服务之外访问 Auth 存储库:

var authRepo = HostContext.AppHost.GetAuthRepository();
var authRepoAsync = HostContext.AppHost.GetAuthRepositoryAsync();

【讨论】:

  • 一如既往的感谢。最后一件事:正如文档所说,如果我们想在 UserAuth 表中嵌入角色,我们可以将 UseDistictRoleTable 属性设置为 false。使用相同的 sn-p,即使您将该属性设置为 false,servicestack 也会创建 UserAuthRole 表:是否正确?再次感谢@mythz
  • @paolot 设置它是不必要的,因为它已经是默认值了。
  • 完全正确,因为默认值为 false。但是我们已经看到它总是创建那个表。我们将尝试理解为什么@mythz
  • @paolot 已在this commit 中修复,将在今天晚些时候在 MyGet 上通知您下一个带有更改的预发布版本。
  • @paolot 仅供参考,现在可以在最新的 v6.0.3 预发布包中使用,现在是 available on MyGet
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多