2017-07-25 5 views
0

Ich versuche, einen Link zu verbergen oder nicht auf die Seite zu gehen, wenn der Benutzer kein Administrator ist. Ich bin in der Lage, die letztere mit diesem Code in meinem Controller zu tun:ViewContext.HttpContext.User.IsInRole ("Admin") funktioniert nicht

[AuthorizeRoles("Admin")] 
public ActionResult Registration() 
{ 
    return View(); 
} 

Wenn ich versuche, den Link mit diesem Code zu verstecken:

@if (!Context.User.Identity.Name.IsEmpty()) 
{ 
    <li id="dd_vehicle" class="dropdown"> 
    <a href="#" class="dropdown-toggle" data-toggle="dropdown">VEHICLE <b class="caret"></b></a> 
    <ul class="dropdown-menu"> 
    @if (ViewContext.HttpContext.User.IsInRole("Admin")) 
    { 
     <li id="item_registration"> 
      @Html.ActionLink("Registration", "Registration", "Home") 
     </li> 
    } 
} 

Der Link versteckt wird. Aber wenn ich mich als "Admin" anmelde, wird der Link immer noch nicht angezeigt.

Dies ist, wie ich AuthorizeAttribute:

public class AuthorizeRolesAttribute : AuthorizeAttribute 
{ 
    private readonly string[] userAssignedRoles; 

    public AuthorizeRolesAttribute(params string[] roles) 
    { 
     this.userAssignedRoles = roles; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     bool authorize = false; 
     using (var db = new SMBI_DBEntities()) 
     { 
      var um = new UserManager(); 
      foreach (var roles in userAssignedRoles) 
      { 
       authorize = um.IsUserInRole(httpContext.User.Identity.Name, roles); 
       if (authorize) 
        return authorize; 
      } 
     } 
      return authorize; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectResult("~/Home/UnAuthorized"); 
    } 
} 

und dies ist in Loginview:

[HttpPost] 
public ActionResult Login(UserLoginView ulv, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     var um = new UserManager(); 
     var password = um.GetUserPassword(ulv.LoginName); 

     if (string.IsNullOrEmpty(password)) 
     { 
      ModelState.AddModelError("", "Login ID and Pasword do not match."); 
     } 
     else 
     { 
      if (ulv.Password.Equals(password)) 
      { 
       FormsAuthentication.SetAuthCookie(ulv.LoginName, false); 
       return RedirectToAction("Registration", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("","Password provided is incorrect."); 
      } 
     } 
    } 
    return View(ulv); 
} 

Hoffnung, die Sie helfen könnten. Vielen Dank.

+0

Die AuthorizeAttribute nicht für die Sichtseite arbeiten; In dieser Hinsicht wird es etwas komplizierter ... Es gibt einige gute Online-Ressourcen, die dabei helfen können. –

Antwort

0

Hallo Sie können wie unten versuchen:

@if(Page.User.IsInRole("Admin")) 
{ 
     <li id="item_registration"> 
      @Html.ActionLink("Registration", "Registration", "Home") 
     </li> 
} 

Hilfreiche Link:How to use Page.User.IsInRole

Und nur als zusätzliche Informationen, können Sie auch Helfer wie unten für die Zukunft Zweck schreiben, wenn erforderlich

public static class PrincipalExtensions 
{ 
    public static bool IsInAllRoles(this IPrincipal principal, params string[] roles) 
    { 
     return roles.All(r => principal.IsInRole(r)); 
    } 

    public static bool IsInAnyRoles(this IPrincipal principal, params string[] roles) 
    { 
     return roles.Any(r => principal.IsInRole(r)); 
    } 
} 

Nun einfach können Sie diese Erweiterungsmethode wie folgt aufrufen:

// user must be assign to all of the roles 
if(User.IsInAllRoles("Admin","Manager","YetOtherRole")) 
{ 
    // do something 
} 

// one of the roles sufficient 
if(User.IsInAnyRoles("Admin","Manager","YetOtherRole")) 
{ 
    // do something 
} 

Quelle:https://stackoverflow.com/a/32385065/3397630

Dank

+0

Karthik, wo sollte ich die "PrincipalExtensions" hinstellen? Sollte es in einer anderen Klasse sein? Wie implementiere ich es? – Ibanez1408

+0

Ich erhalte diesen Fehler: Kann keine Laufzeitbindung für einen NULL-Verweis auf "@if (Page.User.IsInRole (" Admin ")) ausführen" – Ibanez1408

+0

yup "PrincipalExtensions" ist eine separate Klasse, Sobald Sie geschrieben haben, erhalten Sie die zusätzlichen Methoden wie IsInAllRoles, IsInAnyRoles für das Benutzerobjekt. Und für den Fehler "Kann Laufzeitbindung für eine Nullreferenz nicht ausführen" könnte es einen anderen Grund geben, bitte überprüfen Sie diese URL https://forums.asp.net/t/1885663.aspx?Cannot+perform+runtime+bonding+on+ a + null + Referenz + –

Verwandte Themen