3

一部の呼び出しで認証が必要で、一部の呼び出しで認証が不要な REST サービス要件があります。呼び出しはすべて互いに独立しているため、状態はまったく使用されません。うまくいくように見えるものをまとめましたが、これはセッションを使用しない正しい方法ですか?

この質問は、ここで回答されている私の WCF の質問に関連しています。

まず、認証方法を登録しました。

        Plugins.Add(new AuthFeature(() => new AuthUserSession(),
                                    new IAuthProvider[] {
                                        new CustomCredentialsAuthProvider(), //HTML Form post of UserName/Password credentials
                                    }
                        ));

次に、それぞれの呼び出し (またはサービスまたは DTO) に Authenticate 属性を割り当てます。

[Authenticate]
public HelloResponse Post(Hello request)
{
    return new HelloResponse { Result = "Hello, " + request.Name  + " with POST & Auth"};
}

認証を行う BasicAuthProvider クラスから継承します。

public class CustomCredentialsAuthProvider : BasicAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        return userName == "dylan" && password == "abc123";
    }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        session.IsAuthenticated = true;

        //Important: You need to save the session!
         authService.SaveSession(session, new TimeSpan(0,0,10)); 
    }
}

ご覧のとおり、セッションを保存しますが、10 秒後にタイムアウトします。これは、改善できる可能性があると確信している部分です。でもうまく機能しているようです。

私が達成しようとしていることを行うためのより良い方法はありますか? これらのサービスはセッションレスであるため、Auth、AssignRoles、および UnassignRoles メソッドを削除する方法はありますか?

4

1 に答える 1

3

ServiceStack の認証セッションのサポートを引き続き使用したい場合は、サービスの実行後にユーザー セッションをクリアする応答フィルターを追加するだけです。

this.ResponseFilters.Add((req, res, dto) => req.RemoveSession());

基本的に、各リクエストが実行されるとセッションがクリアされるため、認証されたという記録はありません。

それ以外の場合は、ServiceStack の Authentication の使用を完全にスキップして、 FilterAttributesのRequestFitlersを介して独自の認証を提供することができます(これは基本的に、SS Auth が内部で行うことです)。

于 2013-01-11T03:43:04.440 に答える