asp.net-mvc - net - sintaxis razor mvc 5
Agregar autorizaciĆ³n basada en notificaciones a MVC 3 (2)
WIF está diseñado para usar un STS así que si no quieres hacer eso, entonces esencialmente tienes que reinventar la rueda según el artículo.
Cuando te mueves a ADFS, tendrás que volver a codificar todo.
Alternativamente, eche un vistazo a StarterSTS . Esto 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 - aquí ).
Tengo una aplicación MVC a la que me gustaría agregar autorización basada en reclamos. En un futuro cercano, utilizaremos ADFS2 para la identidad federada pero, por el momento, utilizaremos los formularios auth localmente.
¿Alguien ha visto un tutorial o publicación de blog sobre la mejor manera de usar WIF sin un proveedor de identidad externo?
He visto lo siguiente, pero ahora tiene un año y creo que debería haber una solución más fácil:
http://geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
Puede usar WIF en MVC sin un STS.
Usé la plantilla MVC2 predeterminada, pero también debería funcionar con MVC 3.
Necesitas:
1- Enchufe el SessionAuthenticationModule de WIF (web.config)
< add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
2- Dondequiera que autentique a sus usuarios, cree un ClaimsPrincipal , agregue todos los reclamos requeridos y luego cree un SessionSecurityToken . Esta es la Acción de inicio de sesió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 agregar 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á ahora un ClaimsPrincipal . Todo manejado automáticamente por WIF.
CookieHandler.RequiresSsl = false solo se debe a que es una máquina de desarrollo y no estoy implementando en IIS. Se puede definir en la configuración también.