0

Я пытаюсь назначить роли в качестве претензий для Windows Authentication для проекта Asp.net Core Webapi. Ниже мое преобразование, добавив текущую идентификацию роли.добавить претензии к идентификатору Windows

public class ClaimsTransformer : IClaimsTransformer 
    { 
     public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
     { 
      //add new claim 
      var ci = (ClaimsIdentity) context.Principal.Identity; 
      var c = new Claim(ClaimTypes.Role, "admin"); 
      ci.AddClaim(c); 

      return Task.FromResult(context.Principal); 
     } 
    } 

И это промежуточное программное обеспечение добавляется к Startup.Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(LogLevel.Debug); 
      loggerFactory.AddDebug(); 

      app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o)); 

      app.UseStaticFiles(); 

      app.UseMvc(); 
     } 

Однако роль admin не разрешено в этом методе (403-Запрещено).

[Route("api/[controller]")] 
    public class ValuesController : Controller 
    {   
     // GET api/values/5 
     [HttpGet("{id}")] 
     [Authorize(Roles = "admin")] 
     public string Get(int id) 
     { 
      return "value"; 
     } 
    } 

Он работает нормально, если используется [Authorize]. Любые недостающие?

+1

Взгляните на http://stackoverflow.com/a/39032988/5426333 –

+0

При добавлении новой претензии к ClaimsIdentity, если вы хотите, чтобы он работал с IPrincipal.IsInRole (и AuthorizeAttribute (Roles =), тогда вам нужно добавить его с типом претензии ClaimTypes.GroupSid, а не ClaimTypes.Role. Странно, но верно. – Rob

+0

и я думаю, если вы попытаетесь добавить его как 'ClaimTypes.GroupSid' как« admin »вы получаете' System.ComponentModel.Win32Exception: доверительные отношения между основным доменом и доверенным доменом не сработали' –

ответ

2

К сожалению, метод User.IsInRole не работает с ClaimsTransformer (если вы добавите роль в ClaimsTransformer, IsInRole будет false), поэтому вы не можете использовать [Authorize (Роли = "")] с ClaimsTransformer. В этом случае вы можете использовать авторизацию на основе требований, чтобы обрабатывать авторизацию.

Так что добавьте ниже кода ConfigureServices и использовать атрибут Авторизовать:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddAuthorization(options => 
    { 
     options.AddPolicy("admin", policy => policy.RequireClaim(ClaimTypes.Role, "admin")); 
    }); 
    //... 
} 


[Route("api/[controller]")] 
public class ValuesController : Controller 
{   
    // GET api/values/5 
    [HttpGet("{id}")] 
    [Authorize(Policy = "admin")] 
    public string Get(int id) 
    { 
     return "value"; 
    } 
} 
+0

awesome. thanks adem. – beewest

Смежные вопросы