ServiceStack API服务RequiresAnyRole始终返回403错误
我看过几个ServiceStack的身份验证/授权代码示例,但我似乎无法解决这个问题 我已经创建了一个自定义的ServiceStack API服务RequiresAnyRole始终返回403错误,api,authentication,authorization,
servicestack,Api,Authentication,Authorization,
servicestack,我看过几个ServiceStack的身份验证/授权代码示例,但我似乎无法解决这个问题 我已经创建了一个自定义的AuthFeature,它来自BasicAuthProvider,并在我的AppHost上的插件中注册了它。在我的自定义提供者中,我覆盖了tryaauthenticate和OnAuthenticated,并且在我的服务中,我用[Authenticate]和[RequiresAnyRole(“Test”)]的属性修饰了类。在我的用例中,我在Auth头中传递用户名和密码,点击我的服务,它调用
AuthFeature
,它来自BasicAuthProvider
,并在我的AppHost上的插件中注册了它。在我的自定义提供者中,我覆盖了tryaauthenticate
和OnAuthenticated
,并且在我的服务中,我用[Authenticate]
和[RequiresAnyRole(“Test”)]
的属性修饰了类。在我的用例中,我在Auth头中传递用户名和密码,点击我的服务,它调用TryAuthenticate
(并通过身份验证),然后点击OnAuthenticated
方法,我用角色填充会话变量(在本例中为“Test”)。结果是403无效角色
。如果我删除RequiresAnyRole
属性,身份验证就会起作用,我甚至可以查看当前会话变量并查看我创建的角色。此外,我还尝试了RequiredRole
和RequiredPermission
(通过向会话添加权限)获得了相同的结果
有人能告诉我,我是否正确地添加了带有测试角色的会话,或者我是否正确地实现了自定义身份验证提供程序
我的身份验证提供程序代码:
public class AdAuthProvider : BasicAuthProvider
{
public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
var authenticated = false;
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain), userName);
var adRealm = System.Configuration.ConfigurationManager.AppSettings["ADRealm"];
if (userPrincipal != null)
{
using (var pc = new PrincipalContext(ContextType.Domain, adRealm))
{
authenticated = pc.ValidateCredentials(userName, password);
}
}
return authenticated;
}
public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
{
session.Roles = new List<string>();
session.Roles.Add("Test");
authService.SaveSession(session, new System.TimeSpan(0, 30, 0));
return null;
}
您需要使用
AuthRepository
来AssignRole
而不是使用不持久的会话对象
查看GitHub上的assignrole
服务代码,了解如何解析您的authRepo
并分配角色
var authRepo = HostContext.AppHost.GetAuthRepository(base.Request);
using (authRepo as IDisposable)
{
var userAuth = authRepo.GetUserAuthByUserName(request.UserName);
if (userAuth == null)
throw HttpError.NotFound(request.UserName);
authRepo.AssignRoles(userAuth, request.Roles, request.Permissions);
var authRepo = HostContext.AppHost.GetAuthRepository(base.Request);
using (authRepo as IDisposable)
{
var userAuth = authRepo.GetUserAuthByUserName(request.UserName);
if (userAuth == null)
throw HttpError.NotFound(request.UserName);
authRepo.AssignRoles(userAuth, request.Roles, request.Permissions);