ASP.Net核心:声明转换和授权政策

时间:2018-05-11 16:15:15

标签: asp.net-core-mvc

请先查看此网址https://weblogs.asp.net/imranbaloch/claims-transformation-and-authorization-policy-in-aspnet5-mvc6

public virtual Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
 {
 if (principal.Identity.IsAuthenticated)
 {
 // get this from cache or db
 var country = "Pakistan";
 (principal.Identity as ClaimsIdentity).AddClaim(new Claim("Nationality", country));
 }
 return Task.FromResult(principal);
 }

何时会调用TransformAsync() .......如何使用它?

[Authorize(Policy = "MustBePakistani")]
    public IActionResult Message()
    {
        return Content("Hi Pakistani");
    }

当调用Message动作时,asp.net mvc系统将如何理解用户的国籍..... 是巴基斯坦还是印度人?

指导我它是如何运作的。感谢

1 个答案:

答案 0 :(得分:0)

除了问题中的上述两段代码之外,您还需要在Startup.cs中向授权服务添加策略。

实施例,

public class Startup
{    
   public void ConfigureServices(IServiceCollection services)
   {
      ...    
      services.AddAuthorization(options =>
      {
         options.AddPolicy("MustBePakistani", policy => 
            policy.RequireClaim("Nationality", "Pakistan"));
      });
      services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
      ...
   }

   private class ClaimsTransformer : IClaimsTransformation
   {
      // Can consume services from DI as needed, including scoped DbContexts
      public ClaimsTransformer(IHttpContextAccessor httpAccessor)
      {
      }

      public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
      {
         if (principal.Identity.IsAuthenticated)
         {
            // get this from cache or db
            var country = "Pakistan";
            (principal.Identity as ClaimsIdentity)
               .AddClaim(new Claim("Nationality", country));
         }
         return Task.FromResult(principal);
      }
   }
}