ArgumentNullException与ServiceStack中的自定义身份验证提供程序

时间:2020-03-20 16:56:19

标签: servicestack servicestack-auth

我已经基于CredentialsAuthProvider为LDAP(活动目录)创建了自定义身份验证提供程序。在文档之后,我重写了TryAuthenticate和OnAuthenticated,最后返回true。我也尝试了不使用OnAuthenticated。

我为OrmLiteAuthRepository使用UseDistinctRoleTables,并且在表中发现在UserRole中正在创建角色。

但是我遇到了异常:ArgumentNullException。字段名称“ s”。

"stackTrace": "[Authenticate: 20/03/2020 16:46:30]:
[REQUEST: {provider:Credentials,userName:xxxx,password:yyyy}]
System.ArgumentNullException: Value cannot be null.
Parameter name: s
   at lambda_method(Closure , Object , List`1 )
   at ServiceStack.OrmLite.SqlExpression`1.EvaluateExpression(Expression m) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\Expressions\\SqlExpression.cs:line 2374
   at ServiceStack.OrmLite.SqlExpression`1.VisitBinary(BinaryExpression b) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\Expressions\\SqlExpression.cs:line 1658
   at ServiceStack.OrmLite.SqlExpression`1.VisitBinary(BinaryExpression b) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\Expressions\\SqlExpression.cs:line 1622
   at ServiceStack.OrmLite.SqlExpression`1.VisitLambda(LambdaExpression lambda) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\Expressions\\SqlExpression.cs:line 1589
   at ServiceStack.OrmLite.SqlExpression`1.AppendToWhere(String condition, Expression predicate) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\Expressions\\SqlExpression.cs:line 555
   at ServiceStack.OrmLite.ReadExpressionCommandExtensions.Select[T](IDbCommand dbCmd, Expression`1 predicate) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\Expressions\\ReadExpressionCommandExtensions.cs:line 22
   at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter) in C:\\BuildAgent\\work\\27e4cc16641be8c0\\src\\ServiceStack.OrmLite\\OrmLiteExecFilter.cs:line 64
   at ServiceStack.Auth.OrmLiteAuthRepositoryBase`2.<>c__DisplayClass33_0.<GetRoles>b__0(IDbConnection db) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack.Server\\Auth\\OrmLiteAuthRepository.cs:line 571
   at ServiceStack.Auth.OrmLiteAuthRepository`2.Exec[T](Func`2 fn) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack.Server\\Auth\\OrmLiteAuthRepository.cs:line 51
   at ServiceStack.Auth.AuthenticateService.Post(Authenticate request) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\AuthenticateService.cs:line 231
   at ServiceStack.Host.ServiceRunner`1.ExecuteAsync(IRequest req, Object instance, TRequest requestDto) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Host\\ServiceRunner.cs:line 133",

我已经删除了代码。在Startup.cs中:

Plugins.Add(new AuthFeature( () => new AuthUserSession(),
            new IAuthProvider[] {
                new LdapCredentialsAuthProvider(AppSettings),

1 个答案:

答案 0 :(得分:2)

问题是ServiceStack的table <- data.frame(matrix(ncol = 10 , nrow = 11, dimnames=list(c("Number 1", seq(2,11,1)), seq(0,9,1))), check.names=FALSE) datatable(table, rownames=TRUE, class="compact", fillContainer = F, options =list(dom = "t", ordering = F, autoWidth = TRUE)) %>% formatStyle(columns=0, textAlign="right") 试图填充AuthenticateService角色和权限,但是您的自定义AuthProvider并未填充AuthenticateResponse,后者用于查询Auth Repository中的角色

该解决方案是让您的自定义AuthProvider使用经过身份验证的用户的ID填充会话session.UserAuthId

您还可以通过设置UserAuthId来禁止ServiceStack尝试填充角色/权限来防止此异常,例如:

IncludeRolesInAuthenticateResponse=false

在下一个ServiceStack v5.8.1 now on MyGet中,如果未填充Plugins.Add(new AuthFeature( () => new AuthUserSession(), new IAuthProvider[] { new LdapCredentialsAuthProvider(AppSettings), }, "/login.html" ) { IncludeRolesInAuthenticateResponse = false, }); ,它将不会尝试尝试检索角色,但是您的Custom AuthProvider应该仍然使用经过身份验证的用户的唯一ID来填充它。 / p>