2014-09-12 3 views
0

J'utilise le mécanisme de RequiresClaims à Nancy comme ceci:Handling n'a réclamation à Nancy

public class HomeModule : NancyModule 
{ 
    public HomeModule() 
    { 
     Get["/"] = ctx => "<a href=\"/admin\">Go here</a>"; 

     Get["/admin"] = ctx => 
     { 
      this.RequiresClaims(new[] { "boss" }); // this 
      return "Hello!"; 
     }; 

     Get["/login"] = ctx => "<form action=\"/login\" method=\"post\">" + 
      "<button type=\"submit\">login</button>" + 
      "</form>"; 

     Post["/login"] = ctx => 
     { 
      return this.Login(Guid.Parse("332651DD-A046-4489-B31F-B6FA1FB290F0")); 
     }; 
    } 
} 

Le problème est que si l'utilisateur n'a pas le droit d'entrer /admin parce que l'utilisateur ne revendique pas boss, Nancy juste répond avec le statut http 403 et le corps vide.

C'est exactement ce dont j'ai besoin pour la partie service web de mon application, mais il y a aussi des parties de mon application où nancy devrait construire une page pour l'utilisateur. Comment puis-je montrer quelque chose de plus informatif à l'utilisateur?

C'est le mappeur utilisateur que j'utilise:

public class MyUserMapper : IUserMapper 
{ 
    public class MyUserIdentity : Nancy.Security.IUserIdentity 
    { 
     public IEnumerable<string> Claims { get; set; } 
     public string UserName { get; set; } 
    } 

    public Nancy.Security.IUserIdentity GetUserFromIdentifier(Guid identifier, Nancy.NancyContext context) 
    { 
     return new MyUserIdentity { UserName = "joe", Claims = new[] { "peon" } }; 
    } 
} 

Et c'est le bootstrapper que j'utilise:

public class MyNancyBootstrapper : DefaultNancyBootstrapper 
{ 
    protected override void RequestStartup(
     Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines, NancyContext context) 
    { 
     base.RequestStartup(container, pipelines, context); 

     var formAuthConfig = new Nancy.Authentication.Forms.FormsAuthenticationConfiguration 
     { 
      RedirectUrl = "~/login", 
      UserMapper = container.Resolve<Nancy.Authentication.Forms.IUserMapper>() 
     }; 

     Nancy.Authentication.Forms.FormsAuthentication.Enable(pipelines, formAuthConfig); 
    } 
} 

Répondre