Ruby:获取当前在Windows上登录的用户

时间:2010-07-15 01:06:43

标签: windows ruby single-sign-on

在C#中,我可以使用HttpContext获取Web应用程序的当前用户,但是,我无法弄清楚如何在Ruby中执行此操作。有没有办法做到这一点?

对于你所说的那些是不可能的,这是证明:

http://www.codeproject.com/KB/aspnet/How_to_NT_User_Name.aspx

6 个答案:

答案 0 :(得分:10)

嗯,要获取当前的用户名,就是这样:

puts ENV['USERNAME']

或者转到Win32API。

require 'dl/win32'

def get_user_name
  api = Win32API.new(
    'advapi32.dll',
    'GetUserName',
    'PP',
    'i'
  )

  buf = "\0" * 512
  len = [512].pack('L')
  api.call(buf,len)

  buf[0..(len.unpack('L')[0])]
end

puts get_user_name
编辑:我是个白痴。这不是你要求的。哦,好吧,我花了很多时间从我的代码中挖掘出来,所以它也可以留在这里让其他人感到疑惑:P

再次编辑:好吧,事实证明我毕竟不是白痴。这个你想要的。当我回去重新阅读你的问题时,HttpContext把我扔了,我认为这是来自HTTP auth的当前用户名。

答案 1 :(得分:1)

要在客户端计算机上获取当前用户的用户名,您可以使用此

ENV [ 'USERNAME']

答案 2 :(得分:0)

如果您正在使用Rails,请尝试:request.env['HTTP_REMOTE_USER']

答案 3 :(得分:0)

我认为您的意思是如何检索用户用于登录Web应用程序的用户名。根据您使用的身份验证机制,这将有所不同。例如,某些Apache身份验证模块将传递REMOTE_USER(例如Kerberos模块),CAS Single-Sign-On模块传递CAS-USER等。标准摘要身份验证等使用Authentication头。你应该能够像上面提到的那样使用request.env [HEADER]来访问它们。查看有关身份验证层如何在HTTP请求中传递给用户的文档。

答案 4 :(得分:0)

您的c#代码是作为.NET插件/客户端代码运行还是整个服务器端?你的ruby代码完全是服务器端的。根据MS文档,只有在CLR沙箱中运行的东西才能真正获得这些信息:

http://msdn.microsoft.com/en-us/magazine/cc163700.aspx(在定义沙箱下)。

有趣的是,在LocalIntranet下注册的网站可以访问该信息。我不确定这是如何映射到IE中的安全区域的。

要理解的是,浏览器沙箱不再可见LOGON_USER,浏览器可以看到系统上文件系统路径的内容。您的c#代码看到它几乎肯定表明某些客户端组件将其传递到上游。

您可以选择在apache下实现mod_ntlm并将标头推向下游。我没有点发布第二个链接,但谷歌'rails ntlm sso'并看到rayapps.com链接。

但如果您的应用不是基于Rails的,则必须将其移植到您的服务器代码中。如果您的应用符合机架标准,您还可以结帐rack-ntlm。

答案 5 :(得分:0)

[仅限于RUBY]

这对我有用,但有一些限制:

如果您不关心这些问题,请继续:

  1. 在您的rails应用程序中,将Rekado的gem添加到您的Gemfile中:gem 'ntlm-sso', '=0.0.1'

  2. 使用以下内容创建初始化config/initializers/ntlm-sso.rb

    require 'rack'
    require 'rack/auth/ntlm-sso'
    
    class NTLMAuthentication
      def initialize(app)
        @app = app
      end
    
      def call(env)
        auth = Rack::Auth::NTLMSSO.new(@app)
        return auth.call(env)
      end
    end
    
  3. application.rb文件上添加以下行:config.middleware.use "NTLMAuthentication"

  4. 在您的视图或控制器上调用request.env["REMOTE_USER"]以获取当前用户名。

  5. PS:如果您发现无论如何都要在Chrome上运行或验证用户凭据,请与我们联系。

相关问题