asp.net mvc - User.IsInRole no funciona
asp.net-mvc forms-authentication (16)
Pega este código en Global.asax
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie =
Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket =
FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(new Char[] { '','' });
GenericPrincipal userPrincipal =
new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
Context.User = userPrincipal;
}
}
protected class RolesAttribute : AuthorizeAttribute
{
public RolesAttribute(params string[] roles)
{
Roles = String.Join(",", roles);
}
}
Tengo la aplicación ASP.NET MVC 4. Uso el proveedor de membresía simple que me permite marcar la casilla de verificación Recordarme en el formulario de inicio de sesión Si está marcado, se crea una cookie .ASPXAUTH persistente que expira 100 días después de la fecha de inicio de sesión. Y todo funciona bien, aparte del menú principal de la aplicación.
Algunas partes del menú están disponibles solo para usuarios administrativos. Yo suelo:
@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }
para bloquearlos de ser prestados para el usuario regular. Este enfoque funciona bien justo después de iniciar sesión en el sistema. Cuando vuelvo después de un tiempo y se usa una cookie persistente para autenticarme, me conecto, pero
@User.IsInRole("Administrator")
devuelve "Falso", así que no puedo ver los elementos del menú de administración. Al mismo tiempo
@User.Identity.Name
devuelve el nombre de inicio de sesión adecuado y
@User.Identity.IsAuthenticated
devuelve "Verdadero", lo que prueba que la cookie persistente funciona bien. ¿Por qué no puedo acceder a los roles de usuario aunque el sistema autentique al usuario?
¿Has intentado añadir
[InitializeSimpleMembership]
en el controlador donde estas haciendo el cheque?
Añadir página delante del usuario. Esto funciona: Page.User.IsInRole("Administrator")
Antigua pregunta, pero hay algo de información que falta aquí. Me encontré con el mismo problema, y hay una cosa que tener en cuenta. Si prueba la identidad del usuario ( como User.IsInRole ("admin") ) justo después de la autenticación ( sin enviar la respuesta al cliente ), el marco de identidad no ha completado esta información de sesión todavía (o al menos, no pude encontrar la manera de Haz eso). Esta información que está solicitando se llena en algún momento después de que regrese su controlador. Si desea (IE) redirigir a diferentes vistas después de iniciar sesión, dependiendo de la función del usuario, tendrá que usar un filtro de autorización personalizado.
El "correo electrónico confirmado" de esta cuenta probablemente aún sea falso, intente cambiarlo a verdadero
He estado luchando con el administrador de roles MVC5 desde hace algún tiempo. He verificado que User.IsInRole
puede devolver resultados diferentes al mismo tiempo, y aparentemente esto se debe a que el objeto User
se almacena en caché y debe ser invalidado. Una forma de hacerlo es desconectarse y volver a iniciar sesión como una de las respuestas aquí especificadas. Solo tira esto en el controlador que agrega el nuevo rol:
UserManager.AddToRole(User.Identity.GetUserId(), "Administrator");
var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
AuthenticationManager.SignOut();
AuthenticationManager.SignIn(newIdentity);
Sin embargo, si el usuario tiene su aplicación abierta en otras ventanas, esto no las actualizará todas.
Ninguna de estas respuestas funcionó para mí, pero encontré la respuesta aquí: https://thinkthencode.wordpress.com/2016/04/24/azure-ad-using-app-roles-for-authorization/
La clave fue agregar lo siguiente a Startup.Auth.cs
:
TokenValidationParameters = new TokenValidationParameters
{
RoleClaimType = "roles"
}
Para mi código tenía que ser plural, no singular:
User.IsInRole("Administrators")
Problema al usar roles con MVC5
Encontré una solución. En mi web.config:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" />
</modules>
Agregué la línea remove name = "RoleManager", y el nuevo código AspNet.Identity asumió el control permitiéndome usar User.IsInRole (..)
http://forums.asp.net/t/1952572.aspx?Problem+using+roles+with+MVC5
Si está utilizando IdentityManager by Brock Allen para crear roles y asignarlos a usuarios, debería leer este artículo: https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3
Tendrá que descomentar la línea siguiente:
this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;
Ahora se dará cuenta de que su usuario que solía estar en roles ya no está en ellos, y tendrá que volver a agregarlos. Si echa un vistazo a la tabla AspNetUserClaims, verá ClaimType of Role y '' http://schemas.microsoft.com/ws/2008/06/identity/claims/role '' que desea más adelante.
Una vez que haces esto, User.IsInRole("rolename")
comporta como se espera.
Espero que esto ayude a alguien, me tomó un tiempo para resolver esto.
Si está utilizando el marco de identidad más reciente, consulte si está utilizando las siguientes
services.AddIdentity<IdentityUser,IdentityRole>()
.AddEntityFrameworkStores<WebUserContext>()
.AddDefaultTokenProviders();
Si está utilizando los roles AddDefaultIdentity, no se rellenan.
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<WebUserContext>()
.AddDefaultTokenProviders();
Tuve un problema similar con IsUserInRole
devuelve falso. Al ponerle un reloj, pude superar el problema usando la sobrecarga que se describe a continuación. Pruébelo, ponga un punto de ruptura en el que se está volviendo falso y vea qué sucede.
@if (Roles.IsUserInRole(Model.UserName, "Administrator"))
Estoy bastante seguro de que también podría usar User.Identity.Name
como primer parámetro.
Tuve un problema similar, parece que el módulo de autenticación no está completamente conectado con SimpleMembershipProvider. Para solucionar ese problema, puede usar una clase de rol para acceder a la información necesaria. Por ejemplo, para verificar si el uso en rol puede usar lo siguiente:
Roles.GetRolesForUser("sergey").Contains("Developer")
Y así, otros métodos útiles al trabajar con roles SimpleMembershipProvider:
Roles.RoleExists("Developer")
Roles.CreateRole("Developer");
Roles.AddUserToRole("sergey", "Developer");
Tuve un problema similar, pero en mi caso el problema fue que el tiempo de espera de la sesión no se sincronizó con el tiempo de espera de la autenticación, por lo que no me expulsaron automáticamente sino que mi sesión estaba caducada y, dado que mis operaciones permitidas se almacenaron en una variable de sesión , No he podido recuperar las opciones correctas para el usuario actual.
Intente verificar si su sesión no ha caducado, incluso si todavía está conectado
Tuve un problema sonriente En mi caso, el problema se resolvió cuando cierro sesión y vuelvo a iniciar sesión.
Un tema bastante antiguo, pero se puede confirmar en la aplicación de formularios web vs 2015: la solución funciona:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" /> <!--add this to web config-->
</modules>