5

私はServiceStackを見てきましたが、既存のデータベースを使用するサービスでBasicAuthenticationを使用する方法を理解しようとしています。公開鍵(ユーザー名)と秘密鍵(パスワード)を生成し、それを既存のユーザーレコードに入れたいと思います。次に、ユーザーはそれをリクエストとともにServiceStackエンドポイントに渡します。

これを機能させるには、ServiceStackスタックに何を実装する必要がありますか?

IUserAuthRepositoryとCredentialsAuthProviderの両方の基本クラスを確認しましたが、既存のデータベーステーブルの上にIUserAuthRepositoryを実装する必要があるようです。

また、認証を機能させるために実装する必要のある最低限のものを理解しようとしています。サービスへのユーザーアクセスを追加または更新するためにサービスを使用するのではなく、別のWebアプリケーションを使用します。

どんな助けや過去の経験も大歓迎です。

4

2 に答える 2

4

既存のデータベースに対する認証の例(この場合はUmbraco / ASP.NETメンバーシップシステムを介して)。1)AuthProviderを作成します(冗長なコードを許可し、TryAuthenticateもオーバーライドする必要がないことに注意してください。これは、ユーザーが特定のUmbracoアプリケーションエイリアスのメンバーであるかどうかを確認するためにここで行われます):

using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Security;

using ServiceStack.Configuration;
using ServiceStack.Logging;
using ServiceStack.ServiceInterface;
using ServiceStack.ServiceInterface.Auth;
using ServiceStack.WebHost.Endpoints;

using umbraco.BusinessLogic;
using umbraco.providers;

public class UmbracoAuthProvider : CredentialsAuthProvider
{

    public UmbracoAuthProvider(IResourceManager appSettings)
    {
        this.Provider = "umbraco";
    }

    private UmbracoAuthConfig AuthConfig
    {
        get
        {
            return EndpointHost.AppHost.TryResolve<UmbracoAuthConfig>();
        }
    }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        ILog log = LogManager.GetLogger(this.GetType());
        var membershipProvider = (UsersMembershipProvider)Membership.Providers["UsersMembershipProvider"];

        if (membershipProvider == null)
        {
            log.Error("UmbracoAuthProvider.OnAuthenticated - NullReferenceException - UsersMembershipProvider");
            session.IsAuthenticated = false;
            return;
        }

        MembershipUser user = membershipProvider.GetUser(session.UserAuthName, false);

        if (user == null)
        {
            log.ErrorFormat(
                "UmbracoAuthProvider.OnAuthenticated - GetMembershipUser failed - {0}", session.UserAuthName);
            session.IsAuthenticated = false;
            return;
        }

        if (user.ProviderUserKey == null)
        {
            log.ErrorFormat(
                "UmbracoAuthProvider.OnAuthenticated - ProviderUserKey failed - {0}", session.UserAuthName);
            session.IsAuthenticated = false;
            return;
        }

        User umbracoUser = User.GetUser((int)user.ProviderUserKey);

        if (umbracoUser == null || umbracoUser.Disabled)
        {
            log.WarnFormat(
                "UmbracoAuthProvider.OnAuthenticated - GetUmbracoUser failed - {0}", session.UserAuthName);
            session.IsAuthenticated = false;
            return;
        }

        session.UserAuthId = umbracoUser.Id.ToString(CultureInfo.InvariantCulture);
        session.Email = umbracoUser.Email;
        session.DisplayName = umbracoUser.Name;
        session.IsAuthenticated = true;
        session.Roles = new List<string>();
        if (umbracoUser.UserType.Name == "Administrators")
        {
            session.Roles.Add(RoleNames.Admin);
        }

        authService.SaveSession(session);
        base.OnAuthenticated(authService, session, tokens, authInfo);
    }

    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        ILog log = LogManager.GetLogger(this.GetType());
        var membershipProvider = (UsersMembershipProvider)Membership.Providers["UsersMembershipProvider"];

        if (membershipProvider == null)
        {
            log.Error("UmbracoAuthProvider.TryAuthenticate - NullReferenceException - UsersMembershipProvider");
            return false;
        }

        if (!membershipProvider.ValidateUser(userName, password))
        {
            log.WarnFormat("UmbracoAuthProvider.TryAuthenticate - ValidateUser failed - {0}", userName);
            return false;
        }

        MembershipUser user = membershipProvider.GetUser(userName, false);

        if (user == null)
        {
            log.ErrorFormat("UmbracoAuthProvider.TryAuthenticate - GetMembershipUser failed - {0}", userName);
            return false;
        }

        if (user.ProviderUserKey == null)
        {
            log.ErrorFormat("UmbracoAuthProvider.TryAuthenticate - ProviderUserKey failed - {0}", userName);
            return false;
        }

        User umbracoUser = User.GetUser((int)user.ProviderUserKey);

        if (umbracoUser == null || umbracoUser.Disabled)
        {
            log.WarnFormat("UmbracoAuthProvider.TryAuthenticate - GetUmbracoUser failed - {0}", userName);
            return false;
        }

        if (umbracoUser.UserType.Name == "Administrators"
            || umbracoUser.GetApplications()
                          .Any(app => this.AuthConfig.AllowedApplicationAliases.Any(s => s == app.alias)))
        {
            return true;
        }

        log.WarnFormat("UmbracoAuthProvider.TryAuthenticate - AllowedApplicationAliases failed - {0}", userName);

        return false;
    }
}

public class UmbracoAuthConfig
{

    public UmbracoAuthConfig(IResourceManager appSettings)
    {
        this.AllowedApplicationAliases = appSettings.GetList("UmbracoAuthConfig.AllowedApplicationAliases").ToList();
    }

    public List<string> AllowedApplicationAliases { get; private set; }

}

2)通常のAppHostConfigureメソッドを介してプロバイダーを登録します。

    public override void Configure(Container container)
    {
        // .... some config code omitted....

        var appSettings = new AppSettings();
        AppConfig = new AppConfig(appSettings);
        container.Register(AppConfig);

        container.Register<ICacheClient>(new MemoryCacheClient());

        container.Register<ISessionFactory>(c => new SessionFactory(c.Resolve<ICacheClient>()));

        this.Plugins.Add(
            new AuthFeature(
                // using a custom AuthUserSession here as other checks performed here, e.g. validating Google Apps domain if oAuth enabled/plugged in.
                () => new CustomAuthSession(), 
                new IAuthProvider[] { new UmbracoAuthProvider(appSettings) 
                                    }) {
                                          HtmlRedirect = "/api/login" 
                                       });

}

3)Umbracoを使用してユーザー/ APIへのアクセスを管理し、既存のUmbracoデータベース@ yourapidomain / auth/umbracoに対して認証できるようになりました。本当に必要な場合を除いて、追加のユーザーキー/シークレットまたはBasicAuthenticationを実装する必要はありません。

于 2013-05-30T20:27:21.550 に答える
3

私はServiceStackを始めたばかりで、まったく同じものが必要でした。そして、今日それを機能させることができました。

基本認証を介してユーザーにログインするための絶対的な最小要件は次のとおりです。

using ServiceStack.ServiceInterface;
using ServiceStack.ServiceInterface.Auth;

public class CustomBasicAuthProvider : BasicAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        // here, you can get the user data from your database instead
        if (userName == "MyUser" && password == "123")
        {
            return true;
        }

        return false;
    }
}

...そしてそれを:に登録しAppHostます

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new CustomBasicAuthProvider()
    }) { HtmlRedirect = null });

それで全部です!


別の可能な解決策は、デフォルトを使用し、代わりにBasicAuthProvider独自の実装を提供することです。IUserAuthRepository

興味があれば、この例も紹介します。


編集:

最低限必要なものは次のとおりです。IUserAuthRepository継承しInMemoryAuthRepositoryてオーバーライドするだけTryAuthenticateです。

using ServiceStack.ServiceInterface.Auth;

public class CustomAuthRepository : InMemoryAuthRepository
{
    public override bool TryAuthenticate(string userName, string password, out UserAuth userAuth)
    {
        userAuth = null;

        if (userName == "MyUser" && password == "123")
        {
            userAuth = new UserAuth();
            return true;
        }

        return false;
    }
}

...そしてそれを:に登録しAppHostます

container.Register<IUserAuthRepository>(r => new CustomAuthRepository());

もちろん、デフォルトの1つAuthProviders(基本、資格情報など)も登録する必要があります。

于 2013-06-18T22:04:36.207 に答える