嗨,我是使用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个用于管理用户权限和角色的服务:
如何最初授予某人管理员角色
这些服务确实要求/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/