ServiceStack自定义用户身份验证

时间:2016-06-06 22:28:18

标签: c# authentication servicestack

是否有人在此question中提出了如何使用int RefId的实际示例?

我正在尝试进行身份验证,但我需要将userAuth数据与我自己的用户表结合起来。问题是我不知道如何将附加参数传递给" / register"方法。我想我正在寻找像" OnAddUser"这将允许我在混音中添加一些额外的参数。

我设法让用户注册工作非常快,非常简单。也许问题是它太容易了?我可以看到它的工作,但我无法弄清楚如何在它和数据库之间进行。

无论是词典方法还是RefId方法都可能对我有用,对我来说,使用它也不是很明显。

是否可以完全覆盖创建用户?我找到了这段代码:

MyServices.cs

看起来像是在创建用户代替" / register"但是有一些其他文章暗示你不能覆盖ServiceStack DTO,你必须使用默认表。

1 个答案:

答案 0 :(得分:2)

您可以使用RegisterService源代码的副本包含您自己的注册服务,并根据您的需要对其进行修改,例如:将自定义Register DTO与您想要的其他属性一起使用。

但您可以轻松传递其他参数,而无需更改现有的注册DTO,只需将其添加到?querystring,您可以使用以下内容访问服务:

var myParam = base.Request.QueryString["myParam"];

否则,在注册或身份验证期间添加自定义逻辑的方法是使用现有的Session or Auth Events

TechStacks在其CustomAuthUserSession中有一个例子:

public class CustomUserSession : AuthUserSession
{
    public string DefaultProfileUrl { get; set; }

    public string GithubProfileUrl { get; set; }
    public string TwitterProfileUrl { get; set; }

    public override void OnAuthenticated(IServiceBase authService, 
        IAuthSession session, 
        IAuthTokens tokens, 
        Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);
        var appSettings = authService.TryResolve<IAppSettings>();
        var userAuthRepo = authService.TryResolve<IAuthRepository>();
        var userAuth = userAuthRepo.GetUserAuth(session, tokens);
        var dbConnectionFactory = authService.TryResolve<IDbConnectionFactory>();
        foreach (var authTokens in session.ProviderOAuthAccess)
        {
            if (authTokens.Provider.ToLower() == "github")
            {
                GithubProfileUrl = session.GetProfileUrl();
            }
            if (authTokens.Provider.ToLower() == "twitter")
            {
                TwitterProfileUrl = session.GetProfileUrl();
                if (appSettings.GetList("TwitterAdmins").Contains(session.UserName) 
                    && !session.HasRole(RoleNames.Admin))
                {
                    userAuthRepo.AssignRoles(userAuth, roles:new[]{RoleNames.Admin});
                }
            }

            DefaultProfileUrl = GithubProfileUrl ?? TwitterProfileUrl;
            using (var db = dbConnectionFactory.OpenDbConnection())
            {
                var userAuthInstance = db.Single<CustomUserAuth>(x => 
                    x.Id == this.UserAuthId.ToInt());
                if (userAuthInstance != null)
                {
                    userAuthInstance.DefaultProfileUrl = this.DefaultProfileUrl;
                    db.Save(userAuthInstance);
                }
            }
        }
    }
}

当用户通过GitHub或Twitter登录时,会获取用户的个人资料网址。将管理员角色分配给 TwitterAdmins AppSetting中的用户,这是一种为已知Twitter用户分配管理员权限的方法。最后,检索到的配置文件URL将添加到CustomUserAuth POCO表并保存。

TechStacks告诉ServiceStack使用自己的CustomUserAuth表而不是registering a generic OrmLiteAuthRepository

var authRepo = new OrmLiteAuthRepository<CustomUserAuth, UserAuthDetails>(dbFactory);
container.Register<IUserAuthRepository>(authRepo);
authRepo.InitSchema();

现在它将用户信息保存在CustomUserAuth而不是默认的UserAuth表中。