我建议阅读Authentication and authorization wiki,它解释了 ServiceStack 内置的身份验证支持。
后端存储库选项
它描述了您可以将经过身份验证的 UserData 长期保存到的所有潜在后端存储库:
短期会话/缓存提供者
以及用于对经过身份验证的客户端会话进行快速、短期数据访问的所有不同缓存选项:
默认情况下,如果未指定,则使用MemoryCacheClient 。
示例项目
您可以查看部署在http://bootstrapapi.apphb.com上的SocialBootstrap API 项目的源代码,这是一个示例演示,展示了在 Web 应用程序中启用的所有 ServiceStack 支持的身份验证选项。
我将从AppHost.ConfigureAuth()重新发布代码和文档,因为它已经很好地解释了如何配置它。
大多数身份验证提供程序使用 AppSettings 来访问存储在Web.Config中的其他信息:
var appSettings = new AppSettings();
您使用 AuthFeature 插件来注册您要为此 Web 应用启用的所有身份验证方法:
Plugins.Add(new AuthFeature(
() => new CustomUserSession(), //Use your own typed Custom UserSession type
new IAuthProvider[] {
new CredentialsAuthProvider(), //HTML Form post of UserName/Password credentials
new TwitterAuthProvider(appSettings), //Sign-in with Twitter
new FacebookAuthProvider(appSettings), //Sign-in with Facebook
new DigestAuthProvider(appSettings), //Sign-in with Digest Auth
new BasicAuthProvider(), //Sign-in with Basic Auth
new GoogleOpenIdOAuthProvider(appSettings), //Sign-in with Google OpenId
new YahooOpenIdOAuthProvider(appSettings), //Sign-in with Yahoo OpenId
new OpenIdOAuthProvider(appSettings), //Sign-in with Custom OpenId
}));
ServiceStack 允许您指定自己的类型化CustomUserSession,它将用于将 UserAuth 数据持久保存到 Session 中。
如果您想为新用户启用注册服务,以便他们可以使用提供的凭据进行注册和登录:
Plugins.Add(new RegistrationFeature());
您可以选择使用自己的自定义实现覆盖默认注册验证:
//container.RegisterAs<CustomRegistrationValidator, IValidator<Registration>>();
如果您使用的是 OrmLite RDBMS 后端存储库,则需要注册一个 DB Factory,在这种情况下,它被配置为访问 UserAuth SQL Server DB:
var connStr = appSettings.Get("SQLSERVER_CONNECTION_STRING", //AppHarbor or Local connection string
ConfigUtils.GetConnectionString("UserAuth"));
container.Register<IDbConnectionFactory>(
new OrmLiteConnectionFactory(connStr, //ConnectionString in Web.Config
SqlServerOrmLiteDialectProvider.Instance) {
ConnectionFilter = x => new ProfiledDbConnection(x, Profiler.Current)
});
上面的 ConnectionFilter 是可选的,但允许您使用 ServiceStack 的内置 Mini Profiler 来分析数据库查询。
现在您已经在上面注册了您的 RDBMS 连接,您可以将它连接起来,使其成为IUserAuthRepository
身份验证功能:
//Use OrmLite DB Connection to persist the UserAuth and AuthProvider info
container.Register<IUserAuthRepository>(c =>
new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>()));
如果使用OrmLiteAuthRepository,它可以自动创建 AuthFeature 所需的后端 User Auth 表:
//Drop and re-create all Auth and registration tables
var authRepo = (OrmLiteAuthRepository)container.Resolve<IUserAuthRepository>();
if (appSettings.Get("RecreateAuthTables", false))
authRepo.DropAndReCreateTables();
else
authRepo.CreateMissingTables(); //Create only the missing tables