Frage

Ich bin den Aufbau einer Web-Anwendung mit ASP.NET MVC, die zwei sehr unterschiedliche Arten von Benutzern hat. Ich werde ein Beispiel ersinnen und zu sagen, dass eine Art Content-Produzenten (Herausgeber) ist und ein anderer Inhalt Verbraucher (Abonnenten).

Ich plane nicht die Genehmigung Sachen integrierten ASP.NET auf verwenden, da die Trennung von meinen Benutzern eine Dichotomie ist, du bist entweder einen Verleger oder einen Teilnehmer, nicht beide. Also, die build-in Berechtigung ist komplexer, als ich brauche. Außerdem plane ich auf den Einsatz von MySQL.

Ich dachte über sie in der gleichen Tabelle mit Enumarationsfeld (technisch ein int-Feld) zu speichern. Dann ein CustomAuthorizationAttribute erstellen, wo ich in der usertype für diese Seite benötigt passieren würde.

Zum Beispiel würde die PublishContent Seite usertype == UserType.Publisher erfordern, so dass nur Publishers auf sie zugreifen können. Also, dieses Attribut zu schaffen gibt mir Zugriff auf die Httpcontextbase, die das Standard Benutzerfeld enthält (vom Typ IPrincipal). Wie erhalte ich mein Usertype Feld auf diesen IPrincipal? Also, dann würde mein Attribut wie folgt aussehen:

public class PublisherAuthorizationAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.User.Identity.IsAuthenticated)
            return false;

        if (!httpContext.User.Identity.UserType == UserTypes.Publisher)
            return false;

        return true;
    }
}

Oder hat jemand glaubt, mein gesamte Ansatz fehlerhaft ist?

War es hilfreich?

Lösung

Ich würde immer noch die eingebaute in ASP.NET-Formularauthentifizierung verwenden, aber es einfach an Ihre Bedürfnisse anpassen.

So müssen Sie Ihre User-Klasse erhält die IPrincipal Schnittstelle zu implementieren und dann Ihre eigene Cookiebehandlung schreiben. Dann können Sie einfach nur im eingebauten verwenden [autorisieren] Attribut.

Zur Zeit habe ich etwas ähnlich der folgenden ...

In meinem global.asax

protected void Application_AuthenticateRequest()
{
    HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);
    if (cookie == null)
        return;

    bool isPersistent;
    int webuserid = GetUserId(cookie, out isPersistent);

    //Lets see if the user exists
    var webUserRepository = Kernel.Get<IWebUserRepository>();

    try
    {
        WebUser current = webUserRepository.GetById(webuserid);

        //Refresh the cookie
        var formsAuth = Kernel.Get<IFormsAuthService>();

        Response.Cookies.Add(formsAuth.GetAuthCookie(current, isPersistent));
        Context.User = current;
    }
    catch (Exception ex)
    {
        //TODO: Logging
        RemoveAuthCookieAndRedirectToDefaultPage();
    }
}

private int GetUserId(HttpCookie cookie, out bool isPersistent)
{
    try
    {
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
        isPersistent = ticket.IsPersistent;
        return int.Parse(ticket.UserData);
    }
    catch (Exception ex)
    {
        //TODO: Logging

        RemoveAuthCookieAndRedirectToDefaultPage();
        isPersistent = false;
        return -1;
    }
}

AccountController.cs

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(LogOnForm logOnForm)
{
    try
    {
        if (ModelState.IsValid)
        {
            WebUser user = AccountService.GetWebUserFromLogOnForm(logOnForm);

            Response.Cookies.Add(FormsAuth.GetAuthCookie(user, logOnForm.RememberMe));

            return Redirect(logOnForm.ReturnUrl);
        }
    }
    catch (ServiceLayerException ex)
    {
        ex.BindToModelState(ModelState);
    }
    catch
    {
        ModelState.AddModelError("*", "There was server error trying to log on, try again. If your problem persists, please contact us.");
    }

    return View("LogOn", logOnForm);
}

Und schließlich mein FormsAuthService:

public HttpCookie GetAuthCookie(WebUser webUser, bool createPersistentCookie)
{
    var ticket = new FormsAuthenticationTicket(1,
                                               webUser.Email,
                                               DateTime.Now,
                                               DateTime.Now.AddMonths(1),
                                               createPersistentCookie,
                                               webUser.Id.ToString());

    string cookieValue = FormsAuthentication.Encrypt(ticket);

    var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
                         {
                             Path = "/"
                         };

    if (createPersistentCookie)
        authCookie.Expires = ticket.Expiration;

    return authCookie;
}

HTHS
Charles

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top