web-services - ServiceStack Web服务安全性

标签 web-services security servicestack

嗨,我是使用Servicestack的新手,已经下载了非常全面的bootstrapapi示例并正在使用它,但是仍然存在一些问题。安全问题,正在发生的是,当我尝试访问 protected 服务时出现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,一切都会按预期进行,所以现在的问题是为什么。

最佳答案

首先查看Wiki文档

我将首先浏览ServiceStack的Authentication Wiki中的文档,以更好地了解ServiceStack的身份验证的工作方式。 Wiki中有很多文档,因此,如果不确定某些内容,则应先引用该文档。这是一个社区Wiki,因此如果您认为它可以帮助其他人,则可以随意扩展其中的内容。

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

如果不确定什么是什么,则应使用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 ,所以如果您有一个自定义 session ,则可以覆盖session.HasRole()的实现。

注册和实现CustomUserSession

Social BootstrapApi项目确实实现了自己的CustomSession,但没有覆盖HasRole()实现,因此它使用了基本registers here中的内置实现,它看起来像Roles集合,以查看用户在其Session中是否具有指定的角色POCO:
public virtual bool HasRole(string role)
{
    return this.Roles != null && this.Roles.Contains(role);
}

AuthUserRepository填充的 session 属性

角色属性(以及用户 session 上的大多数其他属性)由您指定的AuthUserRepository填充。如果您使用的是AuthUserSession.HasRole()之类的OrmLiteAuthRepository,则Roles属性将保留在SocialBootstrapApi does here Roles 列中。根据AuthUserRepository,您可以使用UserAuth/UserOAuthProvider POCO存储为OrmLite中的RDBMS表或Redis中的文本Blob等。

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

因此,要使用户具有必需的角色(以及通过的授权),则应将此角色添加到其UserAuth db行条目中。 ServiceStack的UserAuth RDBMS table包括2个用于管理用户权限和角色的服务:
  • AuthFeature
  • /assignroles

  • 如何最初授予某人管理员角色

    这些服务确实要求/unassignroles已经通过身份验证。
    您可以通过手动更改特定用户的 UserAuth.Role 列以包括值“Admin”来完成此操作。相反,Social Bootstrap API项目通过处理其user with the Admin Role上的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 }
        });
    }
    

    关于web-services - ServiceStack Web服务安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095094/

    相关文章:

    javascript - AngularJS:登录cookie过期时如何注销

    servicestack - 为什么我在 .net 上从 Ormlite 收到 “variable referenced from scope but not defined” 错误,但在 Mono 上运行良好?

    c# - ServiceStack - 强制为某些类生成 Typescript 类型

    java - 从 JAXB 响应对象获取 Map 值

    c# - asp.net asmx Web 服务返回 xml 而不是 json

    Android 异步消费 Web 服务

    c# - 如何让 .NET WinForms 组件使用 SET 时区而不是客户端时区?

    c# - ASP.Net 中不同的身份验证方式

    php - 在php中保护数据库密码

    android - 如何检测另一个应用程序的存在?