Laden...

Forms Authentifizierung mit Active Directory Groups bei klassischer MVC5 Anwendung

Erstellt von schuppsl vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.286 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 5 Jahren
Forms Authentifizierung mit Active Directory Groups bei klassischer MVC5 Anwendung

Hallöle zusammen.

Ich habe hier eine "klassische" Asp.Net MVC 5 Anwendung bei der einzelne Seiten nur für bestimmte User sein sollten.
Für diese User wird eine neue Gruppe im Active Directory erstellt, damit neue User einfach hinzugefügt werden können.

Dabei soll es keine Hochsicherheits-Anwendung sein, Forms Authentifizierung mit Cookies macht man zwar nimmer, reicht hier aber völlig aus.
Alles bleibt intern.

Gebe ich im entsprechenden Controller die einzelnen Benutzer an, funktioniert es.
Bei den AD-Gruppen aber nicht.

So sieht der Quellcode aus:

Web.config

 <add name="ADConnectionString" connectionString="LDAP://Pfad zum AD" />

....
 <authentication mode="Forms">
      <forms name=".ADAuthCookie" loginUrl="~/Account/Login" timeout="45" slidingExpiration="false" protection="All" />     
    </authentication>
  
    <membership defaultProvider="ADMembershipProvider">
      <providers>
        <clear />
        <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName"  connectionUsername="DOMÄNE\Benutezr" connectionPassword="PASSWORT"/>
      </providers>
    </membership>

Dann im Controller, so funktioniert es:


   
     [Authorize(Users="username")]
        public ActionResult Korrektur()
        {
...
}

So funktioniert es nicht:



  [Authorize(Roles = "DOMÄNE\\GRUPPE)]        
        public ActionResult Korrektur()
        {
           
        }

Die Login Form:


@using (Html.BeginForm(null, null, new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Login</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.UserName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.RememberMe, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.RememberMe)
                    @Html.ValidationMessageFor(model => model.RememberMe, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Log In" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Und der Account Controller:

 public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (!this.ModelState.IsValid)
            {
                return this.View(model);
            }

            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (this.Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return this.Redirect(returnUrl);
                }

                return this.RedirectToAction("Korrektur", "Home");
            }

            this.ModelState.AddModelError(string.Empty, "Benutzername oder Passwort falsch");

            return this.View(model);
        }

Es soll also nur die View "Korrektur" geschützt werden.
Wie gesagt, mit dem User geht es, mit der Gruppe nicht.

Ich sehe zwar, dass der User authentifiziert ist, aber autorisiert für die Seite ist er nicht.

Es ist das erste Mal, dass ich mich damit auseinandersetze, was mache ich falsch?

U
135 Beiträge seit 2009
vor 5 Jahren

Hoi,

ich vermute mal, das fehlende Schlusszeichen ist nur ein Typo? 😉

[Authorize(Roles = "DOMÄNE\\GRUPPE)]

Ansonsten hab ich grade mal in Code bei mir gespickt... ich verwende bei Authorize den Gruppennamen ohne vorangestellte Domäne (obwohl es sich um eine Gruppe in Active Directory handelt) und das klappt wunderbar. Lass doch mal testweise den Domänennamen weg...

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 5 Jahren

Hoi,

ich vermute mal, das fehlende Schlusszeichen ist nur ein Typo? 😉

Ja...
Habe es schon mit und ohne Domäne versucht, beider geht nicht.
Die Gruppe stimmt.
Habe mal gelesen, dass es so mit Gruppen gar nicht geht...muss aber nochmals genauer nachlesen.

Also es liegt nicht daran, dass in der web.config was falsch angegeben ist?

In der Funktion

FormsAuthentication

gebe ich ja den Username an, hier wird dan das Cookie entsprechend angelegt(?)
Im Controller gebe ich aber die Gruppe an.
Also müsste ich das Cookie auch mit der Gruppe anlegen?

16.806 Beiträge seit 2008
vor 5 Jahren

Ein klassisches Forms gibts mit Active Directory eigentlich nicht.

Üblich wäre: Du verwendest die Windows Authentication im IIS. Das bietet auch direkt Single Sign On und es gibt kein Login-Fenster.
Dann funktioniert auch das Attribut; denn das sind schließlich Rollen die aus dem AD geladen werden müssen.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 5 Jahren

Gesagt, getan.

Funktioniert prima, danke 👍