Estoy desarrollando una aplicación web MVC 5 utilizando el enfoque de Entity Framework 5 Database First . Estoy usando OWIN para la autenticación de usuarios. A continuación se muestra mi método de inicio de sesión dentro de mi controlador de cuenta.
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user != null)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Como puede ver, estoy creando un ClaimsIdentity y agregando varios reclamos, luego se lo paso a OWIN usando AuthenticationManager para realizar el inicio de sesión.
El problema que tengo es que no estoy seguro de cómo acceder a las reclamaciones en el resto de mi aplicación, ya sea en Controllers o en Razor Views.
Probé el enfoque enumerado en este tutorial
Por ejemplo, probé esto en mi código de controlador en un intento de obtener acceso a los valores pasados a los reclamos, sin embargo, el usuario. Reclamos es igual a nulo
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
Quizás me esté perdiendo algo aquí.
ACTUALIZAR
Según la respuesta de Darin, agregué su código, pero aún no veo el acceso a las Reclamaciones. Por favor, vea la captura de pantalla a continuación que muestra lo que veo cuando coloco el cursor sobre la identidad.
Respuestas:
Prueba esto:
fuente
También puedes hacer esto:
Actualizar
Para proporcionar más explicaciones según los comentarios.
Si está creando usuarios dentro de su sistema de la siguiente manera:
Debería tener automáticamente algunas Reclamaciones relacionadas con su identidad.
Para agregar reclamos personalizados después de que un usuario se autentica, puede hacer esto de la siguiente manera:
Las afirmaciones se pueden volver a leer como Darin ha respondido anteriormente o como yo.
Los reclamos persisten cuando llama a continuación pasando la identidad en:
fuente
Hago mi propia clase extendida para ver lo que necesito, así que cuando lo necesito en mi controlador o mi Vista, solo agrego el uso a mi espacio de nombres algo como esto:
En mi controlador:
En mi navaja:
fuente
return claim?.Value;
porque ¿por qué no?Esta es una alternativa si no desea utilizar reclamos todo el tiempo. Eche un vistazo a este tutorial de Ben Foster.
Entonces puede agregar un controlador base.
En tu controlador, harías:
fuente
Para tocar más la respuesta de Darin, puede acceder a sus reclamos específicos utilizando el método FindFirst :
fuente
También puedes hacer esto.
fuente
Recuerde que para consultar el IEnumerable debe hacer referencia a system.linq.
Le dará el objeto de extensión necesario para hacer:
fuente
La versión más corta y simplificada de @Rosdi Kasim'd answer es
Claimname
es el reclamo que desea recuperar, es decir, si está buscando el reclamo "StreedAddress", la respuesta anterior será asífuente
Sin embargo, es mejor agregar las reclamaciones dentro del método "GenerateUserIdentityAsync", especialmente si regenerateIdentity en Startup.Auth.cs está habilitado.
fuente
GenerateUserIdentityAsync
fue una sugerencia impresionante, he pasado por alto totalmente. Muchas gracias Basil.Según la clase ControllerBase, puede obtener las notificaciones del usuario que ejecuta la acción.
así es como puede hacerlo en 1 línea.
fuente
fuente
Lo usé así en mi controlador base. Solo compartiendo para estar listo para usar.
fuente