2

Ich habe Schwierigkeiten, eine Ruby on Rails, ActiveAdmin-Anwendung einzurichten, die Devise für die Authentifizierung verwendet. Ich verwende die Azure AD strategy für die Omniauth-Strategie.So richten Sie eine RoR-Anwendung mit SSO auf Azure AD ein

Ich habe hinzugefügt omniauth Strategie in config/initializers/devise.rb:

config.omniauth :azure_activedirectory, 'app id', 'azure tenant id' 

Hinzugefügt wurde die Users::OmniauthCallbacksContoller:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def azure_activedirectory 
    @user = AdminUser.from_omniauth(request.env['omniauth.auth']) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => 'azure_activedirectory') if is_navigational_format? 
    else 
     session['devise.azure_activedirectory_data'] = request.env['omniauth.auth'] 
     redirect_to new_admin_user_registration_url 
    end 
    end 

    def failure 
    redirect_to root_path 
    end 
end 

Und hinzugefügt, um die Callback-Routen zu routes.rb:

Rails.application.routes.draw do 
    devise_config = ActiveAdmin::Devise.config 
    devise_config[:controllers][:omniauth_callbacks] = 'users/omniauth_callbacks' 
    devise_for :admin_users, devise_config 

    devise_scope :admin_user do 
    get 'sign_in', :to => 'devise/sign_in', as: :new_admin_user_session 
    get 'sign_out', :to => 'devise/sign_out', :as => :destroy_admin_user_session 
    end 

    ActiveAdmin.routes(self) 

    root to: redirect('/admin') 
end 

Added die from_omniauth Methode models/admin_user:

class AdminUser < ActiveRecord::Base 
    devise :trackable, :omniauthable, omniauth_providers: [:azure_activedirectory] 

    def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.email = auth.info.email 
     user.password = Devise.friendly_token[0,20] 
    end 
    end 
end 

Aber alles, was ich bekomme, wenn ich die Anwendung auszuführen ist der Fehler: The action 'sign_in' could not be found for Users::OmniauthCallbacksController

ich am Ende bin jetzt, ich weiß nicht, was sonst muss ich tun, um es zu bekommen arbeiten. https://github.com/AzureAD/omniauth-azure-activedirectory und https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview zeige keine Hinweise mehr auf, wie man es beheben kann.

Kann mir jemand helfen, was ich falsch mache?

Antwort

4

Wir haben an dem Projekt ein bisschen mehr gearbeitet und konnten die Azure AD-Authentifizierung lösen.Es gibt jedoch ein paar Dinge, auf die wir stoßen.

Standardmäßig generiert die azure Active Directory-Strategie Routen ohne Unterstrich. So stellen Sie sicher, für die Authentifizierung verwendet das Modell verwendet:

omniauth_providers: [:azureactivedirectory]

Das Modell wurde auch mit den Feldern „Provider“ erweitert und „uid“.

Devise fügt einen Link (c.q.-Schaltfläche) auf der Seite hinzu, um sich anzumelden. Unser Ziel ist es jedoch, nur die Omniumuth-Authentifizierung zu unterstützen und somit keine zusätzliche Anmeldeseite zu haben. Um dies zu erreichen, haben wir eine Weiterleitung hinzugefügt, um die Authentifizierung direkt an den azurblauen Provider weiterzuleiten.

Seien Sie auch vorsichtig, wenn Sie das Mapping ändern (in der config/initializers/device.rb). Wir haben eine Problemumgehung hinzugefügt, falls Devise den Authentifizierungsfehler-Handler für den: api-Bereich nicht finden konnte. In unserem Fall sind wir in eine Schleife geraten, da aufgrund der Zuordnung die Authentifizierung in unserer Anwendung nicht korrekt eingestellt wurde. Unsere Anwendung führte uns zur Authentifizierung Azure, während Azure uns umgeleitet zurück, weil wir bereits authentifiziert wurden, gefolgt von der Anwendung richten uns ... etc.

Unten sind ein paar Code-Schnipsel, die nützlich sein könnten:

config/routes.rb

Rails.application.routes.draw do 

    devise_config = ActiveAdmin::Devise.config 
    # see https://github.com/activeadmin/activeadmin/wiki/Log-in-through-OAuth-providers 
    # for how to combine settings in devise config from ActiveAdmin and SamlSessions 
    devise_config[:controllers][:omniauth_callbacks] = 'omniauth_callbacks' 
    devise_config[:skip] = [:sessions] 
    devise_for :admin_users, devise_config 

    devise_scope :admin_user do 
    get 'sign_in', :to => redirect('/admin/auth/azureactivedirectory'), :as => :new_admin_user_session 
    get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_admin_user_session 
end 

ActiveAdmin.routes(self) 
... 
... 

app/Modelle/admin_user.rb

class AdminUser < ActiveRecord::Base 

    devise :trackable, :omniauthable, omniauth_providers: [:azureactivedirectory] 

    def self.from_omniauth(auth) 
    where(provider: auth['provider'], uid: auth['uid']).first_or_create do |user| 
     user.email = auth['info']['email'] 
    end 
    end 
end 

app/controllers/omniauth_callbacks_controller.rb

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    skip_before_filter :verify_authenticity_token 

    def azureactivedirectory 
    @user = AdminUser.from_omniauth(request.env['omniauth.auth']) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => 'azure_activedirectory') if is_navigational_format? 
    else 
     session['devise.azure_activedirectory_data'] = request.env['omniauth.auth'] 
     redirect_to new_admin_user_registration_url 
    end 
    end 

    def failure 
    redirect_to root_path 
    end 
end 
0

Ich glaube nicht, müssen Sie die folgende Zeile:

get 'sign_in', :to => 'devise/sign_in', as: :new_admin_user_session 

Auf der Devise Docs es sagt, dass, wenn Sie verwenden:

devise_for :admin_users 

Die Devise automatisch die Routen für die Anmeldung erstellen, so dass Sie nur müssen verwenden:

<%= link_to "Sign in with AzureAD", admin_user_omniauth_authorize_path(:azure_activedirectory) %> 

ich hoffe, es hilft Ihnen :)

UPDATE

Wenn Sie sich anmelden, können Sie den Pfad angeben, die der Benutzer umgeleitet werden soll, wie Sie here und here sehen können, zu tun, dass Sie Methoden wie diese auf Ihre Bewerbung angeben Controller:

def after_sign_in_path_for(resource) 
    current_user_path 
end 

und

def after_sign_out_path_for(resource_or_scope) 
    request.referrer 
end 

UPDATE 2

Sie auf ‚/ admin‘ von ‚/‘ umgeleitet zu werden, weil diese Zeile auf Ihrer config/routes.rb

root to: redirect('/admin') 

Dies ist die Wurzel Ihrer Anwendung einstellen, die Standardeinstellung ist es/'zu'/admin '. Wenn Sie diese Zeile entfernen, erkennt Rails den Stamm Ihrer Anwendung als '/'.

+0

Vielen Dank für versuchen zu helfen. Schade, obwohl dies den Fehler behebt, aber ein neues Problem einführt: Ich werde von '/' nach '/ admin' umgeleitet und umgekehrt. –

+0

@MichaelSommer Ich habe meine Antwort bearbeitet, um zu versuchen, dein Problem zu lösen, hoffe, es funktioniert jetzt für dich. –

+0

Wenn ich 'root to:' lösche, werden die Leute nicht mehr zu '/ admin' weitergeleitet und ich erwarte nicht, dass meine Benutzer das selbst erfahren. Meine Wurzel hat den Eintrag für eine API, die Warden statt Devise verwendet. –

Verwandte Themen