我一定错过了一些东西,但是在成功登录后用[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;
}
}
答案 0 :(得分:0)
ServiceStack的Request FilterAttribute用于验证用户是否有权调用服务是[Authenticate]属性。 MVC的[Authorize]
非相关属性仅用于MVC,与ServiceStack的身份验证无关。