8

こんにちは私はServicestackを使用するのは初めてで、非常に包括的なbootstrapapiの例をダウンロードして使用していますが、まだいくつかの問題があります。問題はセキュリティにあります。何が起こっているのかというと、保護されたサービスにアクセスしようとすると405エラーが発生します。認証サービスを使用すると、正しく認証しているように見えます。助けて説明してください。コードは次のとおりです。

public class Hello
{
    public string Name { get; set; }
}

public class AuthHello
{
    public string Name { get; set; }
}

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

サービス:

public class HelloService : ServiceBase<Hello> 
{
    //Get's called by all HTTP Verbs (GET,POST,PUT,DELETE,etc) and endpoints JSON,XMl,JSV,etc
    protected override object Run(Hello request)
    {
        return new HelloResponse { Result = "Hello, Olle är en ÖL ål " + request.Name };
    }
}

[Authenticate()]
public class AuthHelloService : RestServiceBase<AuthHello>
{
    public object Execute(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

[RequiredRole("Test")]
public class RoleHelloService : RestServiceBase<RoleHello>
{
    public object Execute(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

AppHostは次のとおりです。

public class HelloAppHost : AppHostBase
    {
        //Tell Service Stack the name of your application and where to find your web services

        public HelloAppHost() : base("Hello Web Services", typeof(HelloService).Assembly) { }

        public override void Configure(Container container)
        {

            //Register all Authentication methods you want to enable for this web app.
        Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] {new CustomCredentialsAuthProvider(), //HTML Form post of UserName/Password credentials
            }));
        container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false });

            //register user-defined REST-ful urls
            Routes
              .Add<Hello>("/hello")
              .Add<Hello>("/hello/{Name}")
              .Add<AuthHello>("/AuthHello")
              .Add<RoleHello>("/RoleHello");
        }
    }

アップデート

:RestServiceBaseを:ISeviceに置き換えると、すべてが期待どおりに機能するため、問題はその理由です。

4

1 に答える 1

23

最初にwikiドキュメントを確認してください

まず、ServiceStackのAuthentication Wikiのドキュメントを調べて、ServiceStackのAuthenticationがどのように機能するかについてより良いアイデアを得ます。wikiにはたくさんのドキュメントがあるので、何かわからない場合は、最初にそれを参照する必要があります。これはコミュニティウィキなので、他の人に役立つと思われる場合は、そこにあるものを自由に拡張してください。

動作が明確でない場合は、ソースコードの実装を参照してください

何かがわからない場合は、RequiredRoleソースコードをマスターオーソリティとして参照してください。は、属性を持つすべてのサービスの前に実行されるRequiredRole単なるリクエストフィルター属性です。

RequiredRole属性は、次のようにsession.HasRole()メソッドを呼び出すだけです

public bool HasAllRoles(IAuthSession session)
{
    return this.RequiredRoles
        .All(requiredRole => session != null
            && session.HasRole(requiredRole));
}

session.HasRole()セッションを呼び出すだけなので、カスタムセッションがある場合の実装をオーバーライドできます。

CustomUserSessionの登録と実装

Social BootstrapApiプロジェクトは、ここで登録する独自のCustomSessionを実装しますが、実装をオーバーライドしないため、ベースAuthUserSession.HasRole()の組み込み実装を使用します。これは、Rolesコレクションのように見え、ユーザーが指定されているかどうかを確認します。セッションPOCOでの役割:HasRole()

public virtual bool HasRole(string role)
{
    return this.Roles != null && this.Roles.Contains(role);
}

AuthUserRepositoryによって入力されたセッションプロパティ

Rolesプロパティ(およびユーザーセッションの他のほとんどのプロパティ)は、指定したAuthUserRepositoryによって入力されます。たとえば、SocialBootstrapApiのようにOrmLiteAuthRepositoryを使用いる場合、Roles属性はUserAuthRDBMSのRoles列に保持されます。テーブル。AuthUserRepositoryに応じて、UserAuth / UserOAuthProviderを使用します。POCOは、OrmLiteではRDBMSテーブルとして、Redisではテキストブロブとして保存されます。

AssignRoles/UnAssignRolesサービスを使用して役割と権限を管理する

したがって、ユーザーが必要なロール(および渡す権限)を持つには、このロールをUserAuthdb行エントリに追加する必要があります。ServiceStackのAuthFeatureには、ユーザーの権限とロールを管理するための2つのサービスが含まれています。

最初に誰かに管理者の役割を与える方法

これらのサービスでは、管理者ロールを持つユーザーがすでに認証されている必要があります。これを行うには、特定のユーザーのUserAuth.Role列を手動で変更して、値「Admin」を含めます。代わりに、Social Bootstrap APIプロジェクトは、認証されたユーザー名がWeb.Configで宣言されているかどうかを確認するだけのCustomUserSessionOnAuthenticated()でイベントを処理し、宣言されている場合は、その認証されたユーザーに管理者ロールを与えるAssignRolesサービスを呼び出します。

if (AppHost.Config.AdminUserNames.Contains(session.UserAuthName)
    && !session.HasRole(RoleNames.Admin))
{
    var assignRoles = authService.ResolveService<AssignRolesService>();
    assignRoles.Execute(new AssignRoles {
        UserName = session.UserAuthName,
        Roles = { RoleNames.Admin }
    });
}
于 2012-08-23T17:10:00.173 に答える