c# – ServiceStack自定义用户身份验证

有没有人有一个如何使用这个
question中提出的int RefId的实际例子?

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

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

无论是字典方法还是RefId方法都可能对我有用,对我来说,如何使用它也是不明显的.

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

MyServices.cs

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

最佳答案 您可以使用
RegisterService源代码的副本包含您自己的注册服务,并根据您的需要进行修改,例如:使用自定义
Register DTO以及所需的其他属性.

但是,您可以轻松传递其他参数,而无需更改现有的寄存器DTO,只需将其添加到您可以在服务中访问的?查询字符串中:

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登录时,会获取用户的个人资料网址.将Twitter管理员角色分配给TwitterAdmins AppSetting中的用户,这是一种为已知Twitter用户分配管理员权限的方法.最后,将检索到的Profile 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表.

点赞