1

このチュートリアルに従って、ServiceStack サービスで認証をセットアップしようとしています。

私のサービスは[Authenticate]属性で装飾されています。

私の AppHost は次のようになります。

public class TestAppHost : AppHostHttpListenerBase
{
    public TestAppHost() : base("TestService", typeof(TestService).Assembly) { }

    public static void ConfigureAppHost(IAppHost host, Container container)
    {
        try
        {
            // Set JSON web services to return idiomatic JSON camelCase properties.
            ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

            // Configure the IOC container
            IoC.Configure(container);

            // Configure ServiceStack authentication to use our custom authentication providers.
            var appSettings = new AppSettings();
            host.Plugins.Add(new AuthFeature(() =>
                new AuthUserSession(),  // use ServiceStack's session class but fill it with our own data using our own auth service provider
                new IAuthProvider[] { 
                    new UserCredentialsAuthProvider(appSettings)
                }));
        }
   }

UserCredentialsAuthProvider私のカスタム資格情報プロバイダーはどこですか:

public class UserCredentialsAuthProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        try
        {
            // Authenticate the user.
            var userRepo = authService.TryResolve<IUserRepository>();
            var user = userRepo.Authenticate(userName, password);

            // Populate session properties.
            var session = authService.GetSession();
            session.IsAuthenticated = true;
            session.CreatedAt = DateTime.UtcNow;
            session.DisplayName = user.FullName;
            session.UserAuthName = session.UserName = user.Username;
            session.UserAuthId = user.ID.ToString();
        }
        catch (Exception ex)
        {
            // ... Log exception ...
            return false;
        }
        return true;
    }
}

私のユーザー テストでは、TestAppHost を初期化して起動し、JsonServiceClient をhttp://127.0.0.1:8888使用してサービスに対して自身を認証します。

var client = new JsonServiceClient("http://127.0.0.1:8888/")
var response = client.Send<AuthResponse>(new Auth 
{ 
    provider = UserCredentialsAuthProvider.Name,
    UserName = username, 
    Password = password,
    RememberMe = true
});

ただし、次の例外が発生します。

The remote server returned an error: (400) Bad Request.
   at System.Net.HttpWebRequest.GetResponse()
   at ServiceStack.ServiceClient.Web.ServiceClientBase.Send[TResponse](Object request)...

リクエストには正しいユーザー名とパスワードが含まれており、ServiceStack.ServiceInterface.Auth.Authリクエストは次の場所に投稿されています。

http://127.0.0.1:8888/json/syncreply/Auth

なぜ URL が間違っているの/json/auth/credentialsか、何が間違っているのかわかりません。助言がありますか?


アップデート

イベントのチェーンをスタックまでたどると、次のことがわかりました。

JsonDataContractSerializer.SerializeToStreamAuth リクエストを Json に正しくシリアル化します。ただし、System.Net.HttpRequestStream渡されたJsonDataContractDeserializerbyEndpointHandlerBaseには、null (ゼロ バイト) で埋められた正しい長さのストリームがあります。その結果、渡されたリクエスト オブジェクトのCredentialsAuthProvider.Authenticateすべてのプロパティが null になります。

HTTP ストリームからデータを削除するにはどうすればよいですか?

4

1 に答える 1