ASP.Net RegisterUser-Template mit Rollenzuweisung

Das .Net-Framework bietet die Möglichkeit, seine Web-Anwendungen durch Nutzer und Rollen abzusichern. Damit können verschiedene Bereiche einer Web-Anwendung für bestimmte Nutzer-Rollen freigeschaltet bzw. gesperrt werden.

In Visual Studio werden Nutzer-Rollen mit dem Websiteverwaltungs-Tool verwaltet, was einen ziemlich entscheidenden Nachteil hat:
Wenn man bei einem Live-System weitere Nutzer hinzufügen möchte, müsste man mit dem Websiteverwaltungs-Tool umständlich im Nachhinein die einzelnen Nutzer ihren Rollen zuordnen. Da diese Zuordnungen in der Nutzerdatenbank abgespeichert werden, ist genau das nicht immer möglich, da bei Live-Systemen die Datenbanken für Zugriffe von außen gesperrt sind … zumindest sollten sie das sein.

Es wäre also sinnvoll, neuen Nutzern gleich bei der Registrierung eine Rolle zuzuweisen. Das ist aber in der automatisch erstellten Register-Klasse nicht vorgesehen.
Das lässt sich aber mit wenigen Handgriffen nachholen:

Zuerst fügt man in der Register.aspx Ein Element hinzu, in das die Rollen geschrieben werden – in diesem Fall eine DropDownListe.
Zur besseren Lesbarkeit hab ich die überflüssigen Elemente weg gelassen und die Änderungen farblich markiert.

Ich habe die komplette Klasse zum Download bereit gestellt.

<%@ Page Title="Registrieren" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
    CodeBehind="Register.aspx.cs" Inherits="WebApplication2.Account.Register" %> 
 
    <asp:CreateUserWizard ID="RegisterUser" runat="server" EnableViewState="true" OnCreatedUser="RegisterUser_CreatedUser"> 
        <LayoutTemplate> 
            <asp:PlaceHolder ID="wizardStepPlaceholder" runat="server"></asp:PlaceHolder> 
            <asp:PlaceHolder ID="navigationPlaceholder" runat="server"></asp:PlaceHolder> 
        </LayoutTemplate> 
        <WizardSteps> 
            <asp:CreateUserWizardStep ID="RegisterUserWizardStep" runat="server"> 
                <ContentTemplate>
                    .
                    .
                    . 
                   <asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification"  
                         ValidationGroup="RegisterUserValidationGroup"/> 
                    <div class="accountInfo"> 
                        <fieldset class="register">
                            .
                            .
                            .
                            . 
                           <p>
                                <asp:Label id="RoleLabel" runat="server" Text="Rolle des Nutzers"></asp:Label>
                                <asp:DropDownList ID="AvailableRoles" runat="server" SelectionMode="Single" Text="Roles" ></asp:DropDownList>
                           </p>                             
                        </fieldset> 
                        <p class="submitButton"> 
                            <asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Benutzer erstellen"  
                                 ValidationGroup="RegisterUserValidationGroup"/> 
                        </p> 
                    </div> 
                </ContentTemplate> 
                <CustomNavigationTemplate> 
                </CustomNavigationTemplate> 
            </asp:CreateUserWizardStep> 
        </WizardSteps> 
    </asp:CreateUserWizard> 
</asp:Content>

Dann fügt man in der Register.aspx.cs beim Page_Load-Event folgende Zeilen hinzu, um die DropDownList zu füllen:
( Anmerkung: in Mono führte folgende Zeile zu einem Fehler, daher werden die Rollen in der Schleife eingetragen

    .
    .
    ddl.DataSource = roles;

Unter Microsoft .Net hat das Binden der DropDownListe an einen String-Array einwandfrei funktioniert.

protected void Page_Load(object sender, EventArgs e)
{
    RegisterUser.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"];

    string[] roles = Roles.GetAllRoles ();

	
    DropDownList ddl = (DropDownList)RegisterUserWizardStep.ContentTemplateContainer.FindControl("AvailableRoles");
	rol.Items.Clear ();
	foreach (string val in roles)
		rol.Items.Add (val);
	rol.SelectedIndex = 0;
}

Wenn der Nutzer dann erstellt wird, löst der CreateUserWizard ein OnCreatedUser-Event aus, das in der Register.aspx der Funktion RegisterUser_CreatedUser zugewiesen wurde.
In dieser Funktion muss jetzt noch dem Nutzer mit dem Befehl Roles.AddUserToRole die gewählte Rolle zugewiesen werden. Die Einträge in der Datenbank werden dann automatisch generiert.

protected void RegisterUser_CreatedUser(object sender, EventArgs e)
{
    FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */);

    DropDownList ddl = (DropDownList)RegisterUserWizardStep.ContentTemplateContainer.FindControl("AvailableRoles");
    TextBox tb = (TextBox)RegisterUserWizardStep.ContentTemplateContainer.FindControl("UserName");

    Roles.AddUserToRole(tb.Text, rol.SelectedValue);

    string continueUrl = RegisterUser.ContinueDestinationPageUrl;
    if (String.IsNullOrEmpty(continueUrl))
    {
        continueUrl = "~/Default.aspx";
    }
    Response.Redirect(continueUrl);
}        

Schreibe einen Kommentar