0

我正在尋找一種「簡單」的方式向本地用戶自動添加角色聲明以測試我的授權邏輯;也就是說,希望在我的控制器授權之前向本地用戶添加一些特定的聲明。.NET核心MVC在開發授權前向本地用戶添加角色聲明

我瞭解到,在過去的一些類似於這樣可以爲控制器來完成:

#if DEBUG 
protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    var roles = new[] { "role-under-test"}; 
    HttpContext.User = new GenericPrincipal(new GenericIdentity("DebugUser"), roles); 
    base.OnAuthorization(filterContext); 
} 
#endif 

然而,在此之前.NET的核心是這是我在我現在的工作。慢慢地,我已經按照下面提供的代碼工作,這似乎有效,但顯然比上面的例子更麻煩。所以我的問題是,是否有人知道更好 - 更簡單的方法來實現這一目標?

定製的授權屬性:

public class CustomAuthAttribute : RolesAuthorizationRequirement { 
    public CustomAuthAttribute(IEnumerable<string> allowedRoles) : base(allowedRoles) { } 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement) { 
#if DEBUG 
     context.User.AddIdentity(new ClaimsIdentity(new GenericIdentity("DebugUser"), new[] { 
      new Claim(ClaimsIdentity.DefaultRoleClaimType, "users"), 
      new Claim(ClaimsIdentity.DefaultRoleClaimType, "admins") 
     })); 
#endif 
     return base.HandleRequirementAsync(context, requirement); 
    } 
} 

在Startup.cs

public void ConfigureServices(IServiceCollection services) { 
    // ... 

    services.AddAuthorization(options => 
     options.AddPolicy("UsersAndAdmins", 
      policy => policy.AddRequirements(new CustomAuthAttribute(new []{"users", "admins"})))); 
} 

,然後用它的控制器:

[Authorize(Policy = "UsersAndAdmins")]  
public class HomeController : Controller { 
    // ... 
+1

你檢出https:// channel9.msdn.com/博客/ Seth-Juarez /高級 - aspnet-core-Authorization-with-B arry-Dorrans在頻道9上。看起來他們會幫助你很多。這是一個2視頻系列,但有很多偉大的信息在那裏。這實際上是兩個中的第二個 –

回答

1

你想聲明轉換;

寫聲明轉換,看起來像

public class ClaimsTransformer : IClaimsTransformer 
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
    { 
     ((ClaimsIdentity)context.principal.Identity).AddClaim(new Claim("Admin", "true")); 
     return Task.FromResult(principal); 
    } 
} 

而且在startup.cs

app.UseClaimsTransformation(new ClaimsTransformationOptions 
{ 
    Transformer = new ClaimsTransformer() 
}); 

當然絲這裏面Configure了,如果它是測試你把它包裝的環境檢查中,以確保你在你的開發環境:)

+0

你自己試過這個代碼嗎?使用'IClaimsTransformer',我必須實現'公共任務 TransformAsync(ClaimsTransformationContext)'而不是你上面提到的功能。但除此之外,答覆肯定是幫助我解決的一個答案,因此,如果您編輯答覆以反映此評論,我會接受答案。 :) –

+1

哈,不,它被RTM改變了。我的壞,對於如此懶惰抱歉 – blowdart