0

Asp.net Core Webapiプロジェクトの場合、Windows Authenticationのクレームとして役割を割り当てようとしています。以下は、ロールの主張の現在のアイデンティティを追加して私の変換です。窓口にクレームを追加する

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

ClaimsIdentityに新しい請求を追加した場合、あなたならば、http://stackoverflow.com/a/39032988/5426333 –

+0

を見てみましょうIPrincipal.IsInRole(およびAuthorizeAttribute(Roles =))を使用するには、ClaimTypes.RoleではなくClaimTypes.GroupSidのクレームタイプを追加する必要があります。奇妙ですが真実。 – Rob

+0

と追加しようとすると思います'ClaimTypes.GroupSid'として" admin "としてあなたは' System.ComponentModel.Win32Exception:プライマリドメインと信頼されたドメイン間の信頼関係が失敗しました ' –

答えて

2

残念ながら、ClaimsTransformerで[Authorize(Roles = "")]を使用することはできませんので、残念ながら、ClaimsTransformerでUser.IsInRoleメソッドが動作しません(ClaimsTransformerでロールを追加すると、IsInRoleはfalseになります)。この場合、クレームベースの認可を使用して自動処理を処理できます。

ので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

素晴らしいです。ありがとうadem。 – beewest

関連する問題