2017-07-27 5 views
2

Ich benutze Anspruch basierte Authentifizierung und Autorisierung in Aspnetcore 1.1.So zeigen Sie nicht autorisierte Nachricht in Aspnetcore-Identität

Wenn der Benutzer nicht eingeloggt ist, wird er wie erwartet zur Anmeldeseite weitergeleitet.

Wenn der Benutzer zwar angemeldet ist, aber nicht den richtigen Anspruch hat, wird der Benutzer erneut zur Anmeldeseite weitergeleitet.

Wie ändere ich das, damit der Benutzer zu einer anderen Ansicht weitergeleitet wird, die sagt "Sie sind nicht autorisiert ..."?


services.AddAuthorization(options=> 
{ 
    options.AddPolicy("IsEDIAdmin", policy => 
     policy.RequireClaim("IsEDIAdmin")); 
}); 

[Authorize(Policy = "IsEDIAdmin")] 
public IActionResult App() 
{ 
     return PartialView(); 
} 

Antwort

1

Ich denke, es ist ein bisschen komplizierter, als es sein sollte, aber Sie sollten in der Lage sein, eigene Filter zu erstellen. Zum Beispiel (nicht getestet, aber kompiliert):

public class ClaimRequirementAttribute : TypeFilterAttribute 
{ 
    public ClaimRequirementAttribute(string claim, string failUrl) : base(typeof(ClaimRequirementFilter)) 
    { 
     Arguments = new object[] { claim, failUrl }; 
    } 
} 

public class ClaimRequirementFilter : IAsyncActionFilter 
{ 
    private readonly string _claim; 
    private readonly string _failUrl; 

    public ClaimRequirementFilter(string claim, string failUrl) 
    { 
     _claim = claim; 
     _failUrl = failUrl; 
    } 

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     if (!context.HttpContext.User.Claims.Any(c => c.Value == _claim)) 
     { 
      context.Result = new RedirectResult(_failUrl); 
     } 
     else 
     { 
      await next(); 
     } 
    } 
} 

Und es wie folgt verwenden:

[ClaimRequirement("IsEDIAdmin", "/some-exciting/url")] 
public IActionResult Index() 
{ 
    //snip 
} 
+0

Very nice! Will versuchen, tomarrow –

+0

Großartig, lassen Sie mich bitte wissen, wie es geht. – DavidG