3

BasicAuthProvider を使用した ServiceStack での認証に問題があります。プロバイダー ルート 'auth/myauth' を使用して認証する場合はすべて正常に機能しますが、/hello などの [Authenticate] 属性を使用する他のサービス DTOS の 1 つに移動すると、常に 401 Unauthorized エラーが発生します。 jQuery で beforeSend を使用した「Authorization」ヘッダーの基本認証の詳細。

基本的に、私は最初に資格情報認証を含むモバイルアプリ用の API を構築しています (または提供されたトークンの有効期限が切れていない場合)、その後、他の要求に対して提供されたトークンの基本認証を行います。here で説明されているように、すべてのリクエストを認証しようとしています。こちらも。これが私のコードです:

カスタム プロバイダー

public class MyAuthProvider : BasicAuthProvider
{
    public new static string Name = "MyAuth";
    public new static string Realm = "/auth/myauth";

    public MyAuthProvider()
    {
        this.Provider = Name;
        this.AuthRealm = Realm;
    }

    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        var httpReq = authService.RequestContext.Get<IHttpRequest>();
        var basicAuth = httpReq.GetBasicAuthUserAndPassword();

        if (basicAuth == null)
            throw HttpError.Unauthorized("Invalid BasicAuth credentials");

        var us = basicAuth.Value.Key;
        var ps = basicAuth.Value.Value;

        if (ps == "password")
        {
            return true;
        }

        return false;
    }
}

サービス

    public class HelloService : Service
{
    //handle OPTIONS in preflight - http://joeriks.com/2013/01/12/cors-basicauth-on-servicestack-with-custom-authentication/
    public object Options(Hello request) { return true; }

    [Authenticate("MyAuth")]
    public object Post(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }

    [Authenticate("MyAuth")]
    public object Get(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
} 

設定方法

    public override void Configure(Container container)
{
    Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] {
        new MyAuthProvider()
    }));

    //register any dependencies your services use, e.g:
    container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false });

    //set endpoint information
    SetConfig(new EndpointHostConfig
    {
        GlobalResponseHeaders =
        {
            {"Access-Control-Allow-Origin","http://localhost"},
            {"Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"},
            {"Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, Origin" }
        },
    });
}

これは機能します

    function make_base_auth(user, password) {
 var tok = user + ':' + password;
 var hash = btoa(tok);
 return "Basic " + hash;
}

////

$.ajax({
    url: 'http://localhost:61750/auth/myauth?format=json',
    type: 'POST',
    beforeSend: function(xhr) {
         xhr.setRequestHeader("Authorization", make_base_auth("id@email.com","password"));
    }
    }).done(function (data) {
  if( console && console.log ) {
    console.log("Sample of data:", data);
  }
});

しかし、これはそうではありません

$.ajax({
    url: 'http://localhost:61750/hello?format=json',
    data: { Name:"Foo" },
    type: 'POST',
    beforeSend: function(xhr) {
         xhr.setRequestHeader("Authorization", make_base_auth("id@email","password"));
    }
    }).done(function (data) {
  if( console && console.log ) {
    console.log("Sample of data:", data);
  }
});

ご協力いただきありがとうございます。

4

1 に答える 1