2017-08-04 167 views
1

结束我想用asp.net核心实现自定义身份验证/授权流程,但未能这样做。认证似乎工作确定:如果我一步调试一步,我可以看到一个AuthenticationTicket从包含有isAuthenticated到真正的身份ClaimsPrincipal创建:Asp.Net核心自定义授权总是以401未授权

public class MyAuthHandler : AuthenticationHandler<MyAuthOptions> 
{ 
    protected override Task<AuthenticateResult> HandleAuthenticateAsync() 
    { 
     // grab stuff from the HttpContext 
     string authHeader = Request.Headers["Authorization"]; 
     // do some stuff that are successfull in my tests 
     var cp = DoTokenBasedAuthentication(authHeader); 

     var ticket = new AuthenticationTicket(cp, 
      new AuthenticationProperties(), Options.AuthenticationScheme); 
     return Task.FromResult(AuthenticateResult.Success(ticket)); 
    } 
} 

不过,我尝试后添加一个虚拟AuthorizationHandler即:

public class MyRequirement : IAuthorizationRequirement 
{ 
    public MyRequirement() 
    { 
    } 
} 

public class MyAuthRequirement : AuthorizationHandler<MyRequirement> 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement) 
    { 
     context.Succeed(requirement); 
     return Task.CompletedTask; 
    } 
} 

而与此代码在我的启动文件:

services.AddAuthorization(options => 
{ 
    options.AddPolicy("My", 
     policy => policy.Requirements.Add(new MyRequirement())); 
}); 

但每当我加上“[授权(”我“)”在控制器上,那么所有调用总是返回401.而我的AuthorizationHandler从来没有达到。 此问题与Asp.Net Core policy based authorization ends with 401 Unauthorized类似,但与我的情况稍有不同,因为我的用户已通过身份验证。我正在努力调试到asp.net MVC源代码,所以我不知道发生了什么。

回答

2

您授权处理没有出现在被插入 你可以试试下面的行添加到您的Startup.ConfigureServices方法:

services.AddSingleton<IAuthorizationHandler, MyAuthRequirement>(); 
+0

哇...我很惊讶,我永远也不会想到,是一个问题,因为没有什么是抱怨。非常感谢 ! – CanardMoussant