2011-05-13 13 views
16

Tengo una aplicación MVC a la que me gustaría agregar una autorización basada en notificaciones. En un futuro cercano, utilizaremos ADFS2 para la identidad federada pero, por el momento, utilizaremos los formularios auth localmente.Agregar una autorización basada en notificaciones a MVC 3

¿Alguien ha visto un tutorial o una publicación de blog sobre la mejor manera de usar WIF sin un proveedor de identidad externo?

he visto el siguiente, pero se trata de un año de edad ahora y creo que debe haber una solución más fácil:

http://geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx

Respuesta

21

Puede usar WIF en MVC sin STS.

Utilicé la plantilla MVC2 predeterminada, pero debería funcionar también con MVC 3.

Es necesario:

1- Plug WIF 's SessionAuthenticationModule (web.config)

< add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 

2- Donde quiera que autenticar usuarios a, crear un ClaimsPrincipal , agregue todos los reclamos necesarios y luego cree un SessionSecurityToken. Esta es la LogOn Acción en el AccountController creado por MVC:

[HttpPost] 
     public ActionResult LogOn(LogOnModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (MembershipService.ValidateUser(model.UserName, model.Password)) 
       { 
        var cp = new ClaimsPrincipal(); 
        cp.Identities.Add(new ClaimsIdentity()); 
        IClaimsIdentity ci = (cp.Identity as IClaimsIdentity); 

        ci.Claims.Add(new Claim(ClaimTypes.Name, model.UserName)); 

        SessionSecurityToken sst = FederatedAuthentication 
         .SessionAuthenticationModule 
         .CreateSessionSecurityToken(cp, 
                "MVC Test", 
                DateTime. 
                 UtcNow, 
                DateTime. 
                 UtcNow. 
                 AddHours 
                 (1), 
                true); 


        FederatedAuthentication.SessionAuthenticationModule.CookieHandler.RequireSsl = false; 
        FederatedAuthentication.SessionAuthenticationModule.AuthenticateSessionSecurityToken(sst, true); 


        //FormsService.SignIn(model.UserName, model.RememberMe); 
        if (!String.IsNullOrEmpty(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "The user name or password provided is incorrect."); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 

Acabo de añadir las líneas requeridas y dejó todo lo demás igual. Por lo tanto, puede ser necesaria una refacturación.

A partir de ahí, su aplicación recibirá un ClaimsPrincipal. Todo manejado automáticamente por WIF.

El CookieHandler.RequiresSsl = false es sólo porque es una máquina dev y no voy a desplegar en IIS. Se puede definir en la configuración también.

+0

Entonces, ¿cómo vas a agregar otro proveedor de identidad? como google o adfs? – BentOnCoding

1

WIF está diseñado para utilizar un STS así que si no quieres haz eso, entonces esencialmente tienes que reinventar la rueda según el artículo.

Cuando te mueves a ADFS, casi tendrás que volver a codificar todo.

Como alternativa, eche un vistazo a StarterSTS, implementa el mismo tipo de autenticación aspnetdb que necesita pero permite que WIF haga el trabajo pesado. Luego, cuando migre a ADFS, simplemente tiene que ejecutar FedUtil contra ADFS y todo funcionará sin ningún cambio importante en la codificación.

(Por cierto, hay una versión MVC - una implementación posterior - here).

Cuestiones relacionadas