Umsetzung von CAS

Implementierungsansatz der älteren CAS‑Version

Kernprinzip (CAS‑1.0‑Protokoll)

  1. Benutzer ruft die geschützte Seite /admin/admin.aspx auf
  2. Die Berechtigungsregeln in web.config blockieren anonyme Benutzer und leiten automatisch zur Anmeldeseite CasEnter.aspx weiter
  3. CasEnter.aspx prüft, ob der URL‑Parameter ticket vorhanden ist
  • Kein Ticket vorhanden: Weiterleitung zur Anmeldeseite des CAS‑Servers, die aktuelle Site‑Adresse wird als service übergeben
  • Ticket übergeben: Aufruf der Schnittstelle serviceValidate zur Ticketprüfung am CAS‑Server
  1. CAS liefert XML‑Daten zurück, daraus wird der angemeldete Benutzername extrahiert
  2. Nach erfolgreicher Prüfung wird FormsAuthentication.SetAuthCookie() aufgerufen, um das lokale Forms‑Anmeldeticket zu schreiben, anschließend erfolgt die Weiterleitung zur Zielseite
  3. Bei späteren Zugriffen auf geschützte Verzeichnisse erkennt ASP.NET Forms den Anmeldezustand

web.config‑Konfiguration

<system.web>
  <authentication mode="Forms">
    <!-- loginUrl verweist auf CasEnter.aspx als CAS‑Eingangs‑Relaisseite -->
    <forms loginUrl="CasEnter.aspx" 
           defaultUrl="admin/admin.aspx" 
           name=".LoginFormsTicket" 
           path="/" 
           timeout="40" 
           protection="All">
    </forms>
  </authentication>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>

<!-- Anonymen Zugriff auf das admin‑Verzeichnis unterbinden -->
<location path="admin">
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>Code-Sprache: HTML, XML (xml)

Neuere CAS‑Server erzwingen standardmäßig HTTPS, casUrl muss mit https://127.0.0.1:8443/cas/ befüllt werden

<appSettings>
  <!-- Adresse für die neue CAS7‑Version mit abschließendem Schrägstrich -->
  <add key="casUrl" value="https://127.0.0.1:8443/cas/"/>
</appSettings>Code-Sprache: HTML, XML (xml)

Quellcode der Seite CasEnter.aspx

1. CasEnter.aspx Frontend‑Markup
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CasEnter.aspx.cs" Inherits="CasStudy.Web.CasEnter" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>CAS‑Relais‑Anmeldung</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server"></asp:Label><br />
            <asp:HyperLink ID="HyperLink1" runat="server">Erneute Authentifizierung</asp:HyperLink>
        </div>
    </form>
</body>
</html>Code-Sprache: HTML, XML (xml)
2. CasEnter.aspx.cs Code‑Behind‑Logik


Schnittstelle auf CAS3.0 p3/serviceValidate aktualisiert
HttpClient hinzugefügt, um das veraltete WebClient zu ersetzen

Kompatibilität für selbstsignierte Zertifikate ergänzt (erforderlich für lokale Tests mit neueren CAS‑Versionen)
Namensraum‑Verarbeitung für das von CAS zurückgelieferte XML

using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Xml;
using System.Web.Security;

public partial class CasEnter : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string casHost = ConfigurationManager.AppSettings["casUrl"];
        string ticket = Request.QueryString["ticket"];
        string service = Request.Url.GetLeftPart(UriPartial.Path);

        // Kein Ticket vorhanden, Weiterleitung zur CAS‑Anmeldeseite
        if (string.IsNullOrEmpty(ticket))
        {
            string redirectUrl = $"{casHost}login?service={Uri.EscapeDataString(service)}";
            Response.Redirect(redirectUrl);
            return;
        }

        // Ticket prüfen
        string username = ValidateTicket(casHost, ticket, service);
        if (string.IsNullOrEmpty(username))
        {
            Label1.Text = "Entschuldigung! Die CAS‑Authentifizierung ist fehlgeschlagen, bitte versuchen Sie es erneut!";
            HyperLink1.NavigateUrl = Request.Url.AbsolutePath;
        }
        else
        {
            // Forms‑Authentifizierungsticket schreiben, lokale Anmeldung abschließen
            FormsAuthentication.SetAuthCookie(username, false);
            // Zur Zielseite weiterleiten
            Response.Redirect(FormsAuthentication.DefaultUrl);
        }
    }

    /// <summary>
    /// Ticketprüfung über CAS3.0 p3/serviceValidate
    /// </summary>
    private string ValidateTicket(string casHost, string ticket, string service)
    {
        // Neuere CAS‑Versionen empfehlen p3/serviceValidate (CAS3.0‑Protokoll)
        string validateUrl = $"{casHost}p3/serviceValidate?ticket={Uri.EscapeDataString(ticket)}&service={Uri.EscapeDataString(service)}";

        // Lokaler Test: Nicht vertrauenswürdige SSL‑Zertifikate zulassen (im Produktivbetrieb entfernen!)
        ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, err) => true;

        using var httpClient = new HttpClient();
        string xml = httpClient.GetStringAsync(validateUrl).Result;

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
        // Namensraum des von CAS3 zurückgegebenen XML
        nsMgr.AddNamespace("cas", "http://www.yale.edu/tp/cas");

        // Benutzer‑Knoten suchen
        XmlNode userNode = doc.SelectSingleNode("//cas:authenticationSuccess/cas:user", nsMgr);
        return userNode?.InnerText;
    }
}Code-Sprache: HTML, XML (xml)

Umsetzung von CAS

Previous:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert