1

ServiceStackを使用して単純なWebサービスを作成しようとしています。サーバー(サービス)側では、最初にユーザー「administrator」を作成し、それに「Admin」ロールを割り当てました。ServiceStackの組み込みの資格情報認証を使用していますが、適切に認証されます。ただし、[Authenticate]属性で装飾されたWebサービスを後で呼び出すと、次のエラーが返されます。

OAuthプロバイダー「基本」の構成は追加されませんでした

参考:データベースはRavenDbです-ServiceStack.Authentication.RavenDbを使用しています。また、App_Start.AppHost.Configure()にMemoryCacheClientを登録しました。App_Start.AppHostクラスのすべてのコードを表示する必要がある場合はお知らせください。

サーバーコード(抜粋):

namespace MyTest 
{
    [Route("/hello")]
    [Route("/hello/{Name}")]
    [Authenticate]
    public class Hello
    {
        public string Name { get; set; }
    }

    public class HelloResponse
    {
        public string Result { get; set; }
    }

    public class HelloService : Service
    {
        public IUserAuthRepository UserAuthRepo { get; set; }

        public object Any(Hello request)
        {
            return new HelloResponse { Result = "Hello, " + request.Name };
        }
    }
}

クライアント側:

var client = new JsonServiceClient("http://127.0.0.1:65385/auth/credentials?format=json");
var auth   = new Auth { UserName = "administrator", Password = "12345" };

var authResponse = client.Post(auth);

if (authResponse.ResponseStatus.ErrorCode == null)
{
    client = new JsonServiceClient("http://127.0.0.1:65385/hello");
    client.UserName = "administrator";
    client.Password = "12345";

    // When sending the request - it returns "Not Found"
    var helloResponse = client.Send(new Hello { Name = "John" });
}

編集:私のサービスのweb.configは、HelloWorld チュートリアルの
セクション2aに書かれているものとまったく同じように見えます

AppHostの構成は次のとおりです。

public override void Configure(Funq.Container container)
{
    container.Register(new MemoryCacheClient { FlushOnDispose = false });
    container.Register(new EmbeddableDocumentStore { DataDirectory = "Data" }.Initialize());

    ConfigureAuth(container);
}

private void ConfigureAuth(Funq.Container container)
{
    var appSettings = new AppSettings();

    Plugins.Add(new AuthFeature(() => new CustomUserSession(),
        new IAuthProvider[] {
            new CredentialsAuthProvider(appSettings)}));

    Plugins.Add(new RegistrationFeature());

    container.Register(
        new RavenUserAuthRepository(c.Resolve()));
}
4

3 に答える 3

1

まず、 ServiceStack の C# Service Clientsで認証をテストするいくつかの例について、 ServiceStack の AuthTestsを確認する必要があります。

C# ServiceStack クライアントで間違った URL を渡しています。つまり、ServiceStack がホストされているベース URIのみを渡す必要があります。

var client = new JsonServiceClient(
    "http://127.0.0.1:65385/auth/credentials?format=json");
var client = new JsonServiceClient("http://127.0.0.1:65385/hello");

代わりに次のようにする必要があります。

var client = new JsonServiceClient("http://127.0.0.1:65385/");
var client = new JsonServiceClient("http://127.0.0.1:65385/");

また、JsonServiceClient のような ServiceStack C# ServiceClient を使用する場合は、決して?format=jsonAccept: application/jsonを指定しないでください。これは、要求ごとに HTTP ヘッダーを送信することによって JSON が返されることを保証するクライアントでフォーマットが既に暗示されているためです。

于 2013-02-13T05:29:44.813 に答える
1

[Authenticate]、[RequiredRole]、および [RequiredPermission] 属性は基本認証で機能します (認証はダイジェスト認証でも機能します)。したがって、これらの属性のいずれかを使用する場合は、AuthFeature をプラグインとして設定するときに、IAuthProvider のリストに BasicAuthProvider を追加したことを確認する必要があります。そう、

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new CredentialsAuthProvider(appSettings)}));

でなければなりません

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
    new IAuthProvider[] {
        new CredentialsAuthProvider(appSettings),
        new BasicAuthProvider() 
    }));

ただし、すべての呼び出しでユーザー名とパスワードをクリアテキストで送信する必要があります...

于 2013-02-13T13:32:32.107 に答える
0

ServiceStack アプリケーションに ICacheClient を登録していることを確認してください。そうすれば、リクエストごとにユーザー名とパスワードを送信する必要がなくなります。クライアント側は、ユーザー側で何の努力もせずに Cookie の保存を処理できる必要があります。

于 2013-03-11T01:44:07.880 に答える