実現したいこと
WEBアプリからWindowsアカウント名を取得し、別のWEBアプリへログインしたい(SSO連携)
つまりパスワード入力を不要にし、クリックだけでOsアカウント取得によるSSO連携を実現したい。
WEBリンクを配布し、リンククリックにてOSのアカウント名を取得しパラメータに代入。
パラメータ入りのURLへリダイレクトすることでリダイレクト先のWEBシステムへログイン
Ruby on Railsでの実現が望ましいが、方法は何でもいいです
###試したこと
Ruby on RailsではOSアカウント取得方法が見つからなかった為、
ActiveDirectoryから情報を取得できないか試み、gem 'net-ldap'を使用したが、
そもそも連携にはパラメータとしてID・パスワードが必要で無意味。
VBAやJavaScriptで実現できないか検討中だが、WEBの入り口が望ましいです。
###環境
クライアント:Windows10 64bit
Server:WindowsServer2016(AD構築済)
Rails 6.1.3.2
Ruby 2.6.6
###一応検討したコード()
Ruby
1require 'rubygems' 2require 'net/ldap' 3 4#AD認証モジュール 5module ActiveDirectoryAuth 6 7 # ADサーバー設定 8 SERVER = '192.168.99.99' # ADサーバーのホスト名 or IPアドレス 9 PORT = 389 # ADサーバーのポート番号 (default 389) 10 #BASE = 'ou=AAAAAA,dc=aaaaa, dc=net' # ou=トップレベルOU、dc=ADドメイン名1, dc=ADドメイン名2, ... 11 DOMAIN = 'aaaaa.net' # 「ADアカウント名@ADドメイン名」形式のドメイン名部分 12 13 #ADユーザークラス 14 class ActiveDirectoryUser 15 attr_reader :account 16 attr_reader :logged_in 17 attr_reader :entries 18 19 def initialize(account, logged_in, entries) 20 @account = account 21 @logged_in = logged_in 22 @entries = entries 23 end 24 end 25 26 # 認証処理メソッド(ユーザークラスを返す) 27 def self.authenticate(account, pass) 28 logged_in = false 29 entries = nil 30 31 #事前チェック 32 raise "" if account.empty? or pass.empty? 33 34 #LDAPサーバーに接続 35 conn = Net::LDAP.new :host => SERVER, :port => PORT, 36 :auth => { :username => "#{account}@#{DOMAIN}", 37 :password => pass, :method => :simple } 38 #認証処理 39 if conn.bind 40 logged_in = true 41 #属性取得 42 entries = Hash.new 43 conn.open do |ldap| 44 filter = Net::LDAP::Filter.eq("cn", account) 45 ldap.search(:filter => filter, :return_result => false ) do |entry| 46 entry.each do |attr_name, values| 47 entries[attr_name] = values 48 end 49 end 50 end 51 end 52 53 #ユーザークラスを生成して返す 54 return ActiveDirectoryUser.new(account, logged_in, entries) 55 56 #例外時はその時点での情報でユーザークラスを構築して返す 57 rescue Net::LDAP::LdapError => e 58 return ActiveDirectoryUser.new(account, logged_in, entries) 59 end 60end 61 62#ここでIDとPASSが必要 63user = ActiveDirectoryAuth::authenticate('ユーザ名','パスワード') 64 65puts "Account : #{user.account}" 66puts "Logged in: #{user.logged_in}" 67if ( user.entries[:memberof] ) 68 puts "Groups =>" 69 user.entries[:memberof].each do |group| 70 puts "\t" + (group.split(","))[0].split("=")[1] 71 end 72end 73 74
回答1件
あなたの回答
tips
プレビュー