我已经基于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),
答案 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>