Commit 13f45faf authored by o's avatar o
Browse files

saml: show where we are logging in and redirect to sp if session is invalid

parent 48d5877c
......@@ -8,11 +8,9 @@ class ApplicationController < ActionController::Base
before_action :set_locale
def handle_unverified_request
# TODO: something more clever?
# Not sure what though.
# We cannot use the saml_request issuer, since only the idp knows if the
# saml request is legit. Also we do not want to use the referrer as it can
# be spoofed and we would need a whitelist.
if session[:origin_url]
return redirect_to session[:origin_url]
end
redirect_to "https://immerda.ch"
end
......@@ -123,8 +121,10 @@ class ApplicationController < ActionController::Base
def reset_user_session
session[:user_id] = nil
url = session[:origin_url]
reset_session
session[:locale] = I18n.locale
session[:origin_url] = url
update_session_expiry
end
end
......@@ -69,4 +69,10 @@ module ApiBackend
rescue
nil
end
def self.sp_info(request)
get(['auth', 'sp_info'], {saml_request: request})
rescue
nil
end
end
......@@ -17,6 +17,8 @@ class HandoffLoginController < LoginController
else
@horde_select_view = params[:horde_select_view]
end
session[:origin_url] = handoff_url
end
def load_custom_params
......
......@@ -46,7 +46,7 @@ class LoginController < ApplicationController
!!@handoff,
unlock: @input_unlock,
totp: @input_totp,
saml_request: params[:SAMLRequest])
saml_request: @saml_request)
if res
# Login ok
reset_user_session
......@@ -185,10 +185,12 @@ class LoginController < ApplicationController
end
def load_params_new
load_custom_params_new
if params[:unlock] =~ /^[[:alnum:]]+$/
@input_unlock = params[:unlock]
session[:param_unlock] ||= params[:unlock]
end
@input_unlock = session[:param_unlock]
load_custom_params_new
end
def load_params
......@@ -203,7 +205,6 @@ class LoginController < ApplicationController
if session[:pre_auth_id] != @input_user_id
@input_user_id = nil
return
end
@input_pw = params[:password]
......
......@@ -7,9 +7,27 @@ class SamlLoginController < LoginController
end
def load_custom_params_new
session[:saml_request] ||= begin
inp = params[:SAMLRequest]
if Base64.strict_encode64(Base64.decode64(inp)) == inp
inp
end
end
@saml_request = session[:saml_request]
session[:sp_info] ||= begin
if @saml_request
res = ApiBackend::sp_info(@saml_request)
if res['result'] == 'success'
{name: res['sp']['issuer'].gsub(/(http|https):\/\//,""),
url: res['sp']['issuer']}
end
end
end
@sp_info = session[:sp_info] || {}
session[:origin_url] = @sp_info[:url]
end
def load_custom_params
load_custom_params_new
end
end
<p>Zu vermeiden sind:</p>
<ul>
<li><p><strong>Verwende nicht dein Geburtsdatum, ein Wort aus dem Wörterbuch, oder Eigennamen!</strong>. Selbst alle Sprachen kombiniert besitzen nicht genügend Wörter, als dass es für einen Computer nicht trivial wäre alle durchzuprobieren. Dies betrifft auch Wörter, welche einige Buchstaben mit Zahlen ersetzt haben. Z.B. “L13be” ist genauso einfach zu erraten wie “Liebe”.</p></li>
<li><p><strong>Benutze für jedes Konto ein eigenes Passwort</strong>. Es ist unter Umständen besser verschiedene Passwörter sicher aufzuschreiben, als überall dasselbe Passwort zu verwenden.</p></li>
<li><p><strong>Ändere dein Passwort</strong> wenigstens ab und zu.</p></li>
<li><p><strong>Gib dein Passwort nie weiter</strong>, ganz besonders, wenn du danach gefragt wirst.</p></li>
</ul>
<p>Aber wie kannst du ein Passwort erfinden, dass sicher, aber einfach zu merken ist? Hier sind drei bewährte Methoden:</p>
<p><strong>1. Verwende einen sicheren Passwortmanager</strong></p>
<p>Versuch gar nicht erst dir Passwörter zu merken. Stattdessen generier ein neues, Zufälliges für jedes Konto und jede Webseite, die du verwendest; und speichere es in einem Passwortmanager ab. Wir empfehlen <a href="https://www.keepassx.org/">KeepassX</a>: es is open source and verfügbar für Linux, Mac and Windows.</p>
<p><strong>2. Passphrasen</strong></p>
<p>a. Nimm mindestens vier zufällig ausgewählte Wörter, die du dir merken kannst. Zum Beispiel <em>Schmetterling</em> + <em>crypto</em> + <em>resist</em> + <em>paranoia</em> + <em>friends</em> und kombiniere diese in einen Satz. Als zusätzliche Sicherheit, kombiniere verschiedene Sprachen und Wörter, die in keinem Wöreterbuch stehen. So erhältst du ein längeres Passwort, dass aber einfach zum tippen ist.</p>
<p>b. Um die Sicherheit der Passphrase weiter zu erhöhen, kannst du Fantasiewörter hinzufügen, zum Beispiel <em>&ldquo;schmischmetterlingcryptoresistparanoia&rdquo;</em>.</p>
<p><strong>3. Passwörter</strong></p>
<p>a. Beginne mit <strong>mehreren Wörtern</strong>, die du dir einfach merken kannst.</p>
<p>b. Übersetze diese Wörter in einzelne Buchstaben, indem du zum Beispiel den ersten und letzten Buchstaben des Worts übernimmst. Füge zwei, drei zufällige Zahlen oder Symbole hinzu, und fertig ist das Passwort.</p>
<p>Als Beispiel: Du kannst den Satz <em><b>T</b>he <b>R</b>evolutio<b>n</b> <b>w</b>ill <b>n</b>ot <b>b</b>e <b>T</b>elevise<b>d</b></em> in das Passwort <em>&ldquo;tRnwnbTd1$&rdquo;</em> übersetzten.</p>
<p>Things to avoid:</p>
<ul>
<li><p><strong>Don’t pick your birth date, a dictionary word or a proper noun!</strong>. There are simply not that many words in human languages: it is trivial for a computer to try them all! This includes words where you have replaced some letters with numbers. For example, “L0V3” is just as easy to guess as “LOVE”.</p></li>
<li><p><strong>Use a different password for every account</strong>. It can be better to store your passwords in a secure place rather than use the same one everywhere.</p></li>
<li><p><strong>Change your password</strong> at least once in a while.</p></li>
<li><p><strong>Never tell anyone your password</strong>, especially if they ask for it.</p></li>
</ul>
<p>How do you create a password that is strong and yet easy to remember? This can be really tough. There are three generally approved methods:</p>
<p><strong>1. Use a password storage locker</strong></p>
<p>Don’t try to remember passwords. Instead, generate random passwords for all the different services and websites you use, and store them in a secure password locker. We suggest <a href="https://www.keepassx.org/">KeepassX</a>: it is open source and multi-platform (it is available for Linux, Mac and windows).</p>
<p><strong>2. Passphrases</strong></p>
<p>a. Pick at least four random words you can easily remember, for instance <em>butterfly</em> + <em>crypto</em> + <em>resist</em> + <em>paranoia</em> + <em>friends</em> and combine them to one phrase. Mixing in words from different languages and non-dictionary words is a good idea. This gives you a longer, but easy to type password.</p>
<p>b. In order to further increase the complexity of the password you can add words which are not present in any dictionary (like <em>&ldquo;gribabubutterflycryptoresistparanoia&rdquo;</em>).</p>
<p><strong>3. Passwords</strong></p>
<p>a. Start with <strong>multiple words</strong> you can easily remember.</p>
<p>b. Convert these words to <strong>non-words</strong> (for example, by taking the first and last letter of each word), add a few random numbers, or symbols, and you are done.</p>
<p>For example: You could turn <em><b>T</b>he <b>R</b>evolutio<b>n</b> <b>w</b>ill <b>n</b>ot <b>b</b>e <b>T</b>elevise<b>d</b></em> into <em>&ldquo;tRnwnbTd1$&rdquo;</em>.</p>
<p> Para evitar: </p>
<Ul>
<li> <p> <strong> ¡No use su fecha de nacimiento, una palabra de diccionario o nombre propio! </strong>. Incluso todos los idiomas combinados no tienen suficientes palabras, ya que no sería trivial que una computadora las pruebe todas. Esto también se aplica a las palabras que han reemplazado algunas letras con números. Por ejemplo, "4m0r" es tan fácil de adivinar como "amor". </P> </li>
<li> <p> <strong> Use una contraseña diferente para cada cuenta </strong>. Puede ser mejor escribir diferentes contraseñas en un lugar seguro que usar la misma contraseña en todas partes. </P> </li>
<li> <p> <strong> Cambia al menos ocasionalmente tu contraseña </strong>. </p> </li>
<li> <p> <strong> Nunca dices su contraseña </strong>, especialmente si se le solicita. </p> </li>
</Ul>
<p> ¿Pero cómo puedes inventar una contraseña que sea segura pero fácil de recordar? Aquí hay tres mejores prácticas: </p>
<P> <strong>1. Use un administrador de contraseñas seguro </strong> </p>
<p> Ni siquiera intentes recordar las contraseñas. En su lugar, genere un nuevo al azar para cada cuenta y cada página web que use; y guárdalo en un administrador de contraseñas. Recomendamos <a href="https://www.keepassx.org/"> KeepassX </a>: es de código abierto y está disponible para Linux, Mac y Windows. </P>
<P> <strong>2. Frase de contraseña </strong> </p>
<P> a. Tome al menos cuatro palabras aleatorias que pueda recordar. Por ejemplo, <em> mariposa </em> + <em> cripto </em> + <em> resistentes </em> + <em> paranoia </em> + <em> amigos </em> y combinarlos en una frase. Para mayor seguridad, combine diferentes idiomas y palabras que no están en ningún diccionario. Esto le dará una contraseña más larga, pero es fácil de escribir.</P>
<P> b. Para aumentar la seguridad de la contraseña, puedes añadir palabras de fantasía
<P> <strong>3. Las contraseñas </strong> </p>
<P> a. Comienca con <strong> varias palabras </strong> que puedes recordar fácilmente. </P>
<P> b. Traduzca estas palabras en letras individuales, por ejemplo, tomando la primera y la última letra de la palabra. Agregue dos, tres números aleatorios o símbolos, y la contraseña está lista. </P>
<P> Como un ejemplo: se puede el conjunto <em> "<b>T</b>he <b>R</b>evolutio<b>n</b> <b>w</b>ill <b>n</b>ot <b>b</b>e <b>T</b>elevise<b>d</b>"</em> en la contraseña <em>&ldquo;tRnwnbTd1$&rdquo;</em> traducido. </p>
......@@ -18,12 +18,6 @@
<div class="container">
<div class="content">
<% if Admin::Enabled %>
<div class="adminindicator">
Admin!
</div>
<% end %>
<div class="langswitch">
<% available_locales.select{|l| l != I18n.locale }.each do |l| %>
<%= link_to l, request.GET.merge(:l => l) %>
......@@ -31,12 +25,6 @@
<% end %>
</div>
<div class="loginstat">
<% if current_user %>
<%= link_to t(:hello), '/' %> <%= current_user %> (<%= link_to (t :logout), '/logout' %>)
<% end %>
</div>
<div style="clear: both;" />
<div class="content-inner">
......
......@@ -2,6 +2,7 @@
<h3><%= t('handoff.webmail') %></h3>
<% else %>
<h3><%= t(:main_title) %></h3>
<h5><%= @sp_info[:name] %></h5>
<% end %>
<br/>
......
<div id='handoff-page-marker'> </div>
<%= t(:logging_into, target: @sp_info[:name]) %>
<div style="display:none">
<%= form_tag(@saml_acs_url) do %>
<%= hidden_field_tag("SAMLResponse", @saml_response) %>
<%= hidden_field_tag("RelayState", params[:RelayState]) %>
<%= hidden_field_tag("locale", I18n.locale) %>
<%= submit_tag "Submit" %>
<% end %>
</div>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment