servicestack,Api,Authentication,Authorization,servicestack" /> servicestack,Api,Authentication,Authorization,servicestack" />

ServiceStack API服务RequiresAnyRole始终返回403错误

ServiceStack API服务RequiresAnyRole始终返回403错误,api,authentication,authorization,servicestack,Api,Authentication,Authorization,servicestack,我看过几个ServiceStack的身份验证/授权代码示例,但我似乎无法解决这个问题 我已经创建了一个自定义的AuthFeature,它来自BasicAuthProvider,并在我的AppHost上的插件中注册了它。在我的自定义提供者中,我覆盖了tryaauthenticate和OnAuthenticated,并且在我的服务中,我用[Authenticate]和[RequiresAnyRole(“Test”)]的属性修饰了类。在我的用例中,我在Auth头中传递用户名和密码,点击我的服务,它调用

我看过几个ServiceStack的身份验证/授权代码示例,但我似乎无法解决这个问题

我已经创建了一个自定义的
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);