4

我已经编写了几个带有表单身份验证的 ms lightswitch 应用程序 -> 这会在 sql server 中创建 aspnet_* 表。如何在服务堆栈 - 应用程序中使用定义的用户、密码,甚至成员资格、角色和应用程序权限?

4

1 回答 1

6

我尚未对此进行测试,但我认为它应该可以帮助您入门。很高兴在我的任何步骤上得到纠正。

我认为你需要做的事情..

  • 为了对两个“系统”进行身份验证,您需要设置 Forms cookie 并保存您的 ServiceStack 会话。

而不是调用FormsAuthentication.Authentiate()做类似下面的事情。在您完成所有步骤之前,这将不起作用。

var apiAuthService = AppHostBase.Resolve<AuthService>();
apiAuthService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
var apiResponse = apiAuthService.Authenticate(new Auth
{
    UserName = model.UserName,
    Password = model.Password,
    RememberMe = false
});
  • 创建一个子类IUserAuthRepository(用于从 aspnet_* 表中检索成员资格/用户/角色并填充 ServiceStack AuthUser)。

CustomAuthRepository.cs(不完整,但应该可以帮助您入门)

public class CustomAuthRepository : IUserAuthRepository
{
    private readonly MembershipProvider _membershipProvider;
    private readonly RoleProvider _roleProvider;

    public CustomAuthRepository()
    {
        _membershipProvider = Membership.Provider;
        _roleProvider = Roles.Provider;
    }

    public UserAuth GetUserAuthByUserName(string userNameOrEmail)
    {
        var user = _membershipProvider.GetUser(userNameOrEmail, true);
        return new UserAuth {FirstName = user.UserName, Roles = _roleProvider.GetRolesForUser(userNameOrEmail).ToList() //FILL IN REST OF PROPERTIES};
    }

    public bool TryAuthenticate(string userName, string password, out UserAuth userAuth)
    {
        //userId = null;
        userAuth = GetUserAuthByUserName(userName);
        if (userAuth == null) return false;

        if (FormsAuthentication.Authenticate(userName, password))
        {
            FormsAuthentication.SetAuthCookie(userName, false);
            return true;
        }

        userAuth = null;
        return false;
    }
//MORE METHODS TO IMPLEMENT...
}
  • 在 AppHost 配置方法中为 ServiceStack 连接身份验证。

    var userRep = new CustomAuthRepository();
    
    container.Register<IUserAuthRepository>(userRep);
    
    Plugins.Add(
        new AuthFeature(() => new AuthUserSession(),
            new IAuthProvider[] {
                new CredentialsAuthProvider() 
            }
        ));
    
于 2013-02-25T23:09:40.177 回答