4

私はセッションのドキュメントと少し混乱しているので、クライアント側から認証データを既に送信しており、次のように ss-id と ss-pid を取得しているとしましょう:

var client = new JsonServiceClient("http://somewhere/theAPI/");
var response = client.Post(new Auth() {UserName = "myuser", Password = "password123"});
var myCookie= client.CookieContainer.GetCookies(new Uri("http://somewhere/theAPI"));

サービススタックから姓、電子メールなどのような AuthSession 情報を取得するにはどうすればよいですか? memcacheサーバーのような別の場所に保存して、そこから取得する必要がありますか?

または、クライアント側で認証を構築する必要がありますか? APIを使用してデータを取得するだけですか?

4

1 に答える 1

5

カスタム AuthUserSession をすでに作成していると仮定します。次に例を示します。

/// <summary>
/// Create your own strong-typed Custom AuthUserSession where you can add additional AuthUserSession 
/// fields required for your application. The base class is automatically populated with 
/// User Data as and when they authenticate with your application. 
/// </summary>
public class CustomUserSession : AuthUserSession {
    public string CustomId { get; set; }
}

そして、AuthFeature プラグインを構成するときに、次のようにカスタム AuthUserSession を登録しました。

public override void Configure(Container container)
{
    //Register all Authentication methods you want to enable for this web app.            
    Plugins.Add(new AuthFeature(
        () => new CustomUserSession(), //Use your own typed Custom UserSession type
        new IAuthProvider[] {
            new CredentialsAuthProvider(),              //HTML Form post of UserName/Password credentials
            // and any other auth providers you need
        }));
}

次に、作成したサービスでこのデータをクライアントに公開できます。 SocialBotstrapApi は、サーバー上の現在のセッション情報へのアクセスを次のように提供します。これ をモデルとして使用して、現在のユーザーだけの情報を返す UserAuth サービスを作成します。

public abstract class AppServiceBase : Service {
    private CustomUserSession userSession;
    protected CustomUserSession UserSession {
        get {
            return base.SessionAs<CustomUserSession>();
        }
    }
}


[Route("/userauths")]
public class UserAuths
{
    public int[] Ids { get; set; }
}

public class UserAuthsResponse
{
    public UserAuthsResponse()
    {
        this.Users = new List<User>();
        this.UserAuths = new List<UserAuth>();
        this.OAuthProviders = new List<UserOAuthProvider>();
    }
    public CustomUserSession UserSession { get; set; }

    public List<User> Users { get; set; }

    public List<UserAuth> UserAuths { get; set; }

    public List<UserOAuthProvider> OAuthProviders { get; set; }
}

//Implementation. Can be called via any endpoint or format, see: http://servicestack.net/ServiceStack.Hello/
public class UserAuthsService : AppServiceBase
{
    public object Any(UserAuths request)
    {
        var response = new UserAuthsResponse {
            UserSession = base.UserSession,
            Users = Db.Select<User>(),
            UserAuths = Db.Select<UserAuth>(),
            OAuthProviders = Db.Select<UserOAuthProvider>(),
        };

        response.UserAuths.ForEach(x => x.PasswordHash = "[Redacted]");
        response.OAuthProviders.ForEach(x =>
            x.AccessToken = x.AccessTokenSecret = x.RequestTokenSecret = "[Redacted]");
        if (response.UserSession != null)
            response.UserSession.ProviderOAuthAccess.ForEach(x =>
            x.AccessToken = x.AccessTokenSecret = x.RequestTokenSecret = "[Redacted]");

        return response;
    }
}
于 2013-09-19T16:48:57.457 に答える