当前位置: 首页 > 知识库问答 >
问题:

Wildfly 24和Elytron中的多种sasl认证机制

劳烨
2023-03-14

我已经设置了Wildfly,使用OAUTHBEARER身份验证机制在我的服务器和桌面应用程序之间远程查找JNDI EJB,效果非常好。

然而,我也想建立一个简单的。属性基于文件的身份验证方法,在没有令牌的情况下与服务器通信,以便能够请求密钥斗篷身份验证服务器,或访问有关密钥斗篷身份验证服务器的信息,因为我不想将其硬编码到客户端应用程序中,而且我似乎无法使其工作。无论我做什么,服务器都会拒绝我的身份验证尝试。

我试图用以下示例代码访问预授权bean:

private static PreAuth lookUpPreAuthBean() throws NamingException 
{
    final Properties jndiProperties = new Properties();
            
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
    jndiProperties.put(Context.PROVIDER_URL,"http-remoting://localhost:8080");
            
    jndiProperties.put(Context.SECURITY_PRINCIPAL, "test");
    jndiProperties.put(Context.SECURITY_CREDENTIALS, "test");
    
    final Context initialContext = new InitialContext(jndiProperties);

    return (PreAuth) initialContext.lookup("ejb:server/server-ejb/PreAuthImpl!co.my.package.server.PreAuth");
}

以下是我得到的stacktrace:

    Suppressed: javax.security.sasl.SaslException: ELY05019: No token was given
            at org.wildfly.security.mechanism.oauth2.OAuth2Client.getInitialResponse(OAuth2Client.java:66)
            at org.wildfly.security.sasl.oauth2.OAuth2SaslClient.evaluateMessage(OAuth2SaslClient.java:62)
            at org.wildfly.security.sasl.util.AbstractSaslParticipant.evaluateMessage(AbstractSaslParticipant.java:225)
            at org.wildfly.security.sasl.util.AbstractSaslClient.evaluateChallenge(AbstractSaslClient.java:98)
            at org.wildfly.security.sasl.util.AbstractDelegatingSaslClient.evaluateChallenge(AbstractDelegatingSaslClient.java:54)
            at org.wildfly.security.sasl.util.PrivilegedSaslClient.lambda$evaluateChallenge$0(PrivilegedSaslClient.java:55)
            at java.base/java.security.AccessController.doPrivileged(Native Method)
            at org.wildfly.security.sasl.util.PrivilegedSaslClient.evaluateChallenge(PrivilegedSaslClient.java:55)
            at org.jboss.remoting3.remote.ClientConnectionOpenListener$Capabilities.lambda$handleEvent$1(ClientConnectionOpenListener.java:459)
            at org.jboss.remoting3.EndpointImpl$TrackingExecutor.lambda$execute$0(EndpointImpl.java:991)
            at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
            at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
            at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
            at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1348)
            at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1280)
            at java.base/java.lang.Thread.run(Thread.java:829)
        Suppressed: javax.security.sasl.SaslException: DIGEST-MD5: Server rejected authentication
            at org.jboss.remoting3.remote.ClientConnectionOpenListener$Authentication.handleEvent(ClientConnectionOpenListener.java:760)
            at org.jboss.remoting3.remote.ClientConnectionOpenListener$Authentication.handleEvent(ClientConnectionOpenListener.java:602)
            at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
            at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
            at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
            at org.xnio.nio.WorkerThread.run(WorkerThread.java:591)

如果我要提供一个令牌,承载机制工作,似乎出于某种原因,另一个机制没有进行身份验证

以下是Wildfly 24单机版的部分。我修改过的xml:

EJB子系统:

...
<default-security-domain value="other"/>
<application-security-domains>
    <application-security-domain name="other" security-domain="ApplicationDomain"/>
</application-security-domains>
...

Elytron子系统:

  • 我想使用PreAuthRealm进行简单的认证。
<security-domains>
    <security-domain name="ApplicationDomain" default-realm="JWTRealm" permission-mapper="default-permission-mapper">
        <realm name="JWTRealm" role-decoder="jwt-to-roles"/>
        <realm name="PreAuthRealm" role-decoder="groups-to-roles"/>
    </security-domain>
...
<\security-domains>
  • 我想使用application-users.properties文件来存储用户名和密码,这些凭据被添加到存储与add-user.sh脚本
<security-realms>
    <identity-realm name="local" identity="$local"/>
    <properties-realm name="PreAuthRealm">
        <users-properties path="application-users.properties" relative-to="jboss.server.config.dir" digest-realm-name="PreAuthRealm"/>
        <groups-properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
    </properties-realm>
    <token-realm name="JWTRealm" principal-claim="*my claim*">
        <jwt issuer="*my issuer*" audience="account">
           <key kid="*my key id*" public-key="*my public key*"/>
        </jwt>
    </token-realm>
</security-realms>
  • sasl验证工厂设置:
 <sasl-authentication-factory name="application-sasl-authentication" sasl-server-factory="configured" security-domain="ApplicationDomain">
    <mechanism-configuration>
        <mechanism mechanism-name="OAUTHBEARER">
            <mechanism-realm realm-name="JWTRealm"/>
        </mechanism>
        <mechanism mechanism-name="DIGEST-MD5">
            <mechanism-realm realm-name="PreAuthRealm"/>
        </mechanism>   
    </mechanism-configuration>
</sasl-authentication-factory>

远程处理子系统:

<subsystem xmlns="urn:jboss:domain:remoting:4.0">
    <http-connector name="http-remoting-connector" connector-ref="default" sasl-authentication-factory="application-sasl-authentication"/>
</subsystem>

奇怪的是,如果我从远程处理子系统中删除sasl authentication factory=“application sasl authentication”,然后放回原来的security realm=“ApplicationRealm”以上代码运行,它实际上会从远程处理子系统中对我进行身份验证。属性文件,但当然,承载令牌部分将不起作用,这就是重点。

我在这里的设置错过了什么?我想达到的目标可能吗?

共有1个答案

裴和怡
2023-03-14

这不是一个解决方案,而是一个变通办法。通过不将领域命名为“PreAuthRealm”,而是将其命名为默认的“ApplicationRealm”,使其工作,并且无论出于何种原因,将此领域设置为安全域中的默认领域都会使其和JWT领域工作。将“JWTRealm”设置为默认值只会使JWTRealm工作。

 类似资料:
  • 我正在尝试配置WildFly Elytron以允许在管理界面上使用两个不同的域进行身份验证,并有一个后退。

  • 在Zookeeper和代理身份验证上启用SASL时,我面临以下错误。 以下配置在JAAS文件中给出,该文件作为KAFKA_OPTS传递,将其作为JVM参数:- Kafka经纪人的服务器。属性设置了以下额外字段:- Zookeeper属性如下所示:

  • 有人能帮我编写JAAS conf文件和Handler类以使用SASL/OAUTHBEARER进行身份验证吗? 在kafka文档中配置的JAAS文件中,这个选项的含义是什么?

  • 机器认证 Sony Computer Entertainment Inc.运用了一种名为DNAS(Dynamic Network Authentication System)的独特认证系统,可帮助保护著作权与PSP™主机跟网络联机时的加密性。DNAS可能会于PSP™与网络联机时,自动从PSP™将机器ID、游戏名称等硬件与软件的相关信息传送至服务器。但这些被传送的信息不具任何可特定个人之数据。此项系

  • 我有zookeeper配置,允许客户端通过sasl认证(使用digest md5)。Zookeeper配置为使用sasl,sasl身份验证提供程序存在于zookeeper配置中。我有jaas配置和所有用户的列表。每个客户端都有自己的jaas配置文件,其中包含用户和密码。在这种配置下,一切都很好——客户端可以使用zookeeper。 但事情是这样的。我有一些客户端无法直接连接到动物园管理员-它连接并

  • 到 RADOS 网关的 Requests 请求可能已经经过验证也可能没有经 过验证。RGW 假设所有未经验证的请求都是由匿名用户发送的。RGW 支持预置的 ACLs。 认证 对请求进行身份验证需要在它发送到 RGW 服务器之前就包含一个 access 密钥和基于散列消息验证码(HMAC)。RGW 使用兼容 S3 的身份验证方法。 HTTP/1.1 PUT /buckets/bucket/objec