Web服务 – ServiceStack Web服务安全性

嗨,我刚接触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");
        }
    }

UPDATE

如果你用以下内容替换:RestServiceBase,那么一切都会正常工作所以现在问题就是为什么.

解决方法

首先查看wiki文档

我将首先浏览ServiceStack的Authentication Wiki中的文档,以更好地了解ServiceStack的身份验证的工作原理.维基中有很多文档,所以如果你不确定某些东西,你应该首先参考.这是一个社区维基,如果您认为它可以帮助其他人,请随意扩展它们.

如果行为不明确,请参阅源代码中的实现

如果你不确定什么东西,你应该将refer to the RequiredRole source code作为它的主要权威. requiredRole只是一个Request Filter Attribute,它在每个具有该属性的服务之前运行.

requiredRole属性只将您的session.HasRole()方法调用seen here

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

因为它只是调用您的会话,所以如果您有自定义会话,则可以覆盖session.HasRole()的实现.

注册和实现CustomUserSession

Social BootstrapApi项目确实实现了它自己的CustomSession registers here,但没有覆盖HasRole()实现,所以它使用基础AuthUserSession.HasRole()中的内置实现,它看起来像Roles集合,看看用户是否具有指定的角色他们的会议POCO:

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

由AuthUserRepository填充的会话属性

Roles属性(以及用户Session上的大多数其他属性)由您指定的AuthUserRepository填充,例如如果您使用OrmLiteAuthRepository之类的OrmLiteAuthRepository,则Robe属性将保留在UserAuth RDBMS table的Roles列中.根据AuthUserRepository,您使用UserAuth / UserOAuthProvider POCO将存储为OrmLite中的RDBMS表或Redis中的文本blob等.

使用AssignRoles / UnAssignRoles服务管理角色和权限

因此,对于具有所需角色(以及传递授权)的用户,应将此角色添加到其UserAuth数据库行条目中. ServiceStack的AuthFeature包括2个用于管理用户权限和角色的服务:

> /assignroles
> /unassignroles

如何最初给某人管理员角色

这些服务确实要求user with the Admin Role已经过身份验证.
您可以通过手动更改特定用户UserAuth.Role列以包含值“Admin”来执行此操作.相反,Social Bootstrap API项目通过处理其CustomUserSession上的OnAuthenticated()事件来执行此操作,该事件只是检查是否在Web.Config中声明了经过身份验证的用户名,如果是,则调用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 }
    });
}

相关文章

操作步骤 1、进入elasticsearch的plugin,进入ik。进入config。 2、在config下面建立以.dic为后缀的字典...
lengend data数据中若存在&#39;&#39;,则表示换行,用&#39;&#39;切割。
代码实现 option = { backgroundColor: &amp;#39;#080b30&amp;#39;, tooltip: { trigger: &...
问题原因 原因在于直接在js中取的变量并复制给var变量。 于是就变成这样。 解决办法 var data = &#...
前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选...
对于很多人来说,用字符编码都是熟能生巧,而不清楚为什么是那样的字符编码,所以我在这列了一个表,翻...