Pregunta

Estoy creando una aplicación web usando ASP.NET MVC que tiene dos tipos muy distintos de usuarios. Voy a idear un ejemplo y decir que un tipo es productores de contenido (editores) y otro es consumidores de contenido (suscriptores).

No planeo usar el material incorporado de autorización ASP.NET, porque la separación de mis tipos de usuario es una dicotomía, usted es un editor o un suscriptor, no ambos. Entonces, la autorización integrada es más compleja de lo que necesito. Además, estoy planeando usar MySQL.

Estaba pensando en almacenarlos en la misma tabla con un campo enum (técnicamente un campo int). Luego, creando un CustomAuthorizationAttribute, donde pasaría el tipo de usuario necesario para esa página.

Por ejemplo, la página PublishContent requeriría userType == UserType.Publisher, por lo que solo los Editores podrían acceder a ella. Entonces, la creación de este atributo me da acceso a HttpContextBase, que contiene el campo Usuario estándar (de tipo IPrincipal). ¿Cómo consigo mi campo UserType en este IPrincipal? Entonces, mi atributo se vería así:

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;
    }
}

¿O alguien piensa que todo mi enfoque es defectuoso?

¿Fue útil?

Solución

Todavía usaría la autenticación de formularios ASP.NET incorporada, pero simplemente la personalizo según sus necesidades.

Por lo tanto, deberá obtener su clase de Usuario para implementar la interfaz IPrincipal y luego escribir su propio manejo de cookies personalizado. Luego, simplemente puede usar el atributo integrado [Autorizar].

Actualmente tengo algo similar a lo siguiente ...

En mi 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);
}

Y finalmente mi 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top