Implementierungsansatz der älteren CAS‑Version
Kernprinzip (CAS‑1.0‑Protokoll)
- Benutzer ruft die geschützte Seite
/admin/admin.aspxauf - Die Berechtigungsregeln in
web.configblockieren anonyme Benutzer und leiten automatisch zur AnmeldeseiteCasEnter.aspxweiter CasEnter.aspxprüft, ob der URL‑Parameterticketvorhanden ist
- Kein Ticket vorhanden: Weiterleitung zur Anmeldeseite des CAS‑Servers, die aktuelle Site‑Adresse wird als
serviceübergeben - Ticket übergeben: Aufruf der Schnittstelle
serviceValidatezur Ticketprüfung am CAS‑Server
- CAS liefert XML‑Daten zurück, daraus wird der angemeldete Benutzername extrahiert
- Nach erfolgreicher Prüfung wird
FormsAuthentication.SetAuthCookie()aufgerufen, um das lokale Forms‑Anmeldeticket zu schreiben, anschließend erfolgt die Weiterleitung zur Zielseite - 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,
casUrlmuss mithttps://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: Installation