使用ServiceStack创建客户端认证服务?

5

我有几个(移动和桌面)应用程序,需要创建一个简单的Web服务来进行身份验证并向客户端返回信息。

在试图创建会员数据库或查找以前的数据库进行检查时,我遇到了许多问题,使用我正在使用的WCF服务。 我偶然发现了Service Stack。 所以我有几个问题。

Service Stack是否具有开箱即用的数据库和提供程序,以便我可以为客户端添加身份验证,并使其自行创建数据库。 可以避免从头开始创建。

是否已经有ServiceStack服务和数据库的示例,以便我可以作为基础使用?

整个WCF服务对我来说很困惑。 基本上我要寻找的是一个可以用于授权移动应用程序和桌面应用程序的服务,并可能稍后添加一些额外功能。 由于它不会在现有网站上运行,因此它需要自己的数据库,并且需要有一种管理方式。

使用WCF似乎对于这个任务过于复杂,而且我没有找到任何已经存在可供使用的数据库和管理方法的示例。 理想情况下,我希望设置一个空的网站,以便我可以管理帐户,并使WCF服务使用相同的数据库。

使用Service Stack是否可以轻松完成所有这些事情,请问是否已经有相关示例? 如果您对我的当前方法有任何提示,也会很有帮助。

1个回答

12

我建议阅读身份验证和授权wiki页面,该页面解释了内置在ServiceStack中的身份验证支持。

后端存储库选项

它描述了您可以将经过身份验证的用户数据长期保存到的所有潜在后端存储库:

短期会话/缓存提供程序

以及用于快速、短期访问认证客户端会话数据的各种不同缓存选项:

如果未指定缓存提供程序,则默认使用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数据持久化到会话中的方式。

如果您想为新用户启用注册服务,以便他们可以使用提供的凭据进行注册和登录:

Plugins.Add(new RegistrationFeature());

您可以选择使用自己的自定义实现来覆盖默认的注册验证:

//container.RegisterAs<CustomRegistrationValidator, IValidator<Registration>>();

如果您正在使用OrmLite RDBMS后端存储库,您需要注册一个数据库工厂,在这种情况下,它被配置为访问UserAuth SQL Server数据库:

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对DB查询进行分析。

现在,您已经注册了RDBMS连接,可以将其连接起来,使其成为身份验证功能的:

//Use OrmLite DB Connection to persist the UserAuth and AuthProvider info
container.Register<IUserAuthRepository>(c =>
    new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>())); 
如果您使用< strong>OrmLiteAuthRepository strong>, 它可以自动创建AuthFeature所需的后端用户认证表:
//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

1
哇,谢谢。 我下载了SocialBootstrap API项目,哇,我简直不敢相信Servicestack会让它变得如此简单。 通过WCF搜索花费我数天的时间,我只需几分钟就能设置好。 我只有一个问题。 我正在使用基本身份验证,并打开了注册,是否可以用像asp.net用户管理器一样的方式在数据库中管理用户,而无需手动打开db并修改字符串? 以防我需要删除或修改它们? 还是我需要自定义构建它? - user1632018
看看 OrmLite 的工作方式。UserAuth DataModels 只是普通的 POCO,可以像 OrmLite 中的任何其他普通 POCO 一样进行更新/插入/删除操作。IUserAuthRepository 对此有些支持,并且可以像其他依赖项一样在您的服务中访问。 - mythz
我刚刚在研究这个问题,发现了答案。你们/ServiceStack让我节省了很多时间。再次感谢,我非常感激。 - user1632018

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接