Servicestack - 成功登录后未经授权

时间:2016-10-17 17:06:56

标签: servicestack

我一定错过了一些东西,但是在成功登录后用[Authorize]注释的操作会出现Unauthorized错误。我在几个级别上尝试了注释:服务类,RequestDTOs以及我的服务类的单个方法。行为总是一样的。

我创建了自己的CredentialsAuthProvider派生的AuthProvider。我不使用OrmLite,我使用NHibernate 4.我的客户端是WPF应用程序。我的AppHost.Configure()方法如下所示:

    public override void Configure(Container container)
    {
        //Config examples
        //this.Plugins.Add(new PostmanFeature());
        //this.Plugins.Add(new CorsFeature());

        Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[]
            {
                new BediCredentialsAuthProvider(), 
            }
        ));
        Plugins.Add(new ValidationFeature());
        container.RegisterValidators(typeof(AppUserValidator).Assembly);
        container.RegisterAs<BediAuthEvents, IAuthEvents>();
        container.Register<ICacheClient>(new MemoryCacheClient());
    }

然后我注意到其他一些奇怪的(对我而言)行为:我为OnAuthenticated()OnLogout实现了自定义AuthEvents。我在两种情况下都写了一个日志条目。我在两个事件中使用属性session.UserAuthName。在OnAuthenticated()中,此属性已正确填充。在调用我未收到未经授权的错误的操作后,OnLogout方法无法引用session.UserAuthName属性,因为它是 null

任何想法,这里出了什么问题?我的课程似乎有些不对劲,但我不知道是什么!

消息更新

抱歉,我错误输入了我的注释。我使用 [Authenticate] [Authorize]!以下是我的服务类内部的示例:

[Authenticate]
public object Post(CreateAppUser request)
{ .... }

[Authenticate]
public object Put(UpdateAppUser request)
{ .... }

第二次更新

以下是我的AuthProvider的代码:

public class BediCredentialsAuthProvider : CredentialsAuthProvider
{
    public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
    {
        var authResponse = (AuthenticateResponse)base.Authenticate(authService, session, request);
        var user = (AppUser)authService.Request.Items["AppUser"];

        authResponse.Meta = new Dictionary<string, string>();
        authResponse.Meta.Add("TenantName", user.TenantName);
        authResponse.Meta.Add("ResetPwdRequired", user.MustChangePwd.ToString());
        authResponse.Meta.Add("IsLockedOut", user.IsLockedOut.ToString());
        authResponse.Meta.Add("Email", user.EmailAddress);
        authResponse.Meta.Add("DisplayName", user.DisplayName);
        authResponse.Meta.Add("RemoteIP", authService.Request.RemoteIp);

        return authResponse;
    }
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        AppUser user = null;
        using (var session = NhSessionFactories.OpenSession(TopinConstants.TopInDbFactory))
        {
            using (var transaction = session.BeginTransaction())
            {
                try
                {
                    var appUserRepo = new AccountManagementRepository(session);
                    user = appUserRepo.GetAppUser(userName);
                    transaction.Commit();
                    session.Close();
                }
                catch (Exception ex)
                {
                    Log.Error($"Error retrieving user {user} to authenticate. Error: {ex}");
                    throw;
                }
            }
        }
        if (user == null)
            throw HttpError.NotFound("User '{0}' not found. Please try again.".Fmt(userName));

        authService.Request.Items.Add("AppUser", user);
        var pwdMgr = new PwdManager();
        var hpwd = pwdMgr.GetHashedPassword(password, user.Salt);
        return hpwd == user.Password;
    }
}

1 个答案:

答案 0 :(得分:0)

ServiceStack的Request FilterAttribute用于验证用户是否有权调用服务是[Authenticate]属性。 MVC的[Authorize]非相关属性仅用于MVC,与ServiceStack的身份验证无关。

相关问题