このチュートリアルに従って、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.SerializeToStream
Auth リクエストを Json に正しくシリアル化します。ただし、System.Net.HttpRequestStream
渡されたJsonDataContractDeserializer
byEndpointHandlerBase
には、null (ゼロ バイト) で埋められた正しい長さのストリームがあります。その結果、渡されたリクエスト オブジェクトのCredentialsAuthProvider.Authenticate
すべてのプロパティが null になります。
HTTP ストリームからデータを削除するにはどうすればよいですか?