在C#中,我可以使用HttpContext获取Web应用程序的当前用户,但是,我无法弄清楚如何在Ruby中执行此操作。有没有办法做到这一点?
对于你所说的那些是不可能的,这是证明:
http://www.codeproject.com/KB/aspnet/How_to_NT_User_Name.aspx
答案 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]
这对我有用,但有一些限制:
如果您不关心这些问题,请继续:
在您的rails应用程序中,将Rekado的gem添加到您的Gemfile中:gem 'ntlm-sso', '=0.0.1'
使用以下内容创建初始化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
在application.rb
文件上添加以下行:config.middleware.use "NTLMAuthentication"
在您的视图或控制器上调用request.env["REMOTE_USER"]
以获取当前用户名。
PS:如果您发现无论如何都要在Chrome上运行或验证用户凭据,请与我们联系。