3

OrmLite を使用して ServiceStack を評価しています。組み込みの認証サービスは、セッションとキャッシュと共に、ASP.NET メンバーシップ プロバイダーよりもはるかに優れています。

ただし、すぐに使用できる認証サービスは、構築したいアプリに必要な機能の一部を提供していません。

  • パスワードを変更する
  • ログオンに 3 回失敗するとアカウントがロックされる
  • ユーザー アカウントの無効化
  • パスワードリマインダーの質問と回答
  • ログオン試行の監査ログ

カスタム認証プロバイダーを構築する必要がありますか、それとも既にこの機能を提供しているものがありますか?

どうもありがとう!

4

2 に答える 2

1

これが私がやったことです、うまくいきます。-「新しい」はコードの匂いだと気づきました。それを注入するだけです:)

        private int LoginAttempts = 0;

    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        var authRepo = authService.TryResolve<IUserAuthRepository>();

        if (authRepo == null)
        {
            Log.WarnFormat("Tried to authenticate without a registered IUserAuthRepository");
            return false;
        }


        var session = authService.GetSession();

        UserAuth userAuth = null;

        if (authRepo.TryAuthenticate(userName, password, out userAuth))
        {
            session.PopulateWith(userAuth);

            session.IsAuthenticated = true;

            session.UserAuthId = userAuth.Id.ToString(CultureInfo.InvariantCulture);

            session.ProviderOAuthAccess = authRepo.GetUserOAuthProviders(session.UserAuthId)
                .ConvertAll(x => (IOAuthTokens)x);


            return true;
        }
        else
        {
            LoginAttempts++;

            if (LoginAttempts >= 3)
            {
                ServiceStack.ServiceInterface.Service s = new Service();

                s.Db.ExecuteSql("update [User] set AccountLocked = 'true' where Email='" + userName + "'");
            }

            authService.RemoveSession();
            return false;
        }
    }

そして、mod_from_hell がこれを放っておくことを願っています!!!

于 2013-04-23T19:37:15.943 に答える
1

私はパスワードのリセットを実装し始めたばかりで、それを達成する2つの方法を見ることができます(まだテストしていないか、試したことさえありません):

1.Registration を継承し、PUT を処理するクラスを作成します。その後、パスワードを変更する登録クラスの UpdateUserAuth メソッドを呼び出すことができるはずです。問題 - 私にとって - ここで、入力の検証では、1 つだけではなく、ユーザー名とパスワードを指定する必要があるということです (識別子として電子メールのみを使用します)。これは、検証機能をオフにすることで回避できます。

2.UpdateUserAuth が行うことを行うパスワード リセット サービスを作成します。

var session = this.GetSession();
var existingUser = UserAuthRepo.GetUserAuth(session, null);
if (existingUser == null)
{
    throw HttpError.NotFound("User does not exist");
}

var newUserAuth = ToUserAuth(request);
UserAuthRepo.UpdateUserAuth(newUserAuth, existingUser, request.Password);

明らかに、適切な検証を追加する必要があります。

更新しました

パスワード変更リマインダー/リセット サービスをGistとして公開しました(私の最初の Gist!)

于 2013-03-11T16:30:17.117 に答える