2016-02-27 50 views
3

ASP.Net內核允許您使用IClaimsTransformer的實現來修改ClaimsPrincipal。我知道你註冊它是這樣的:如何將一個有限範圍的服務注入到IClaimsTransformer的實現中?

app.UseClaimsTransformation(o => o.Transformer = new MyClaimsTransformer()); 

但MyClaimsTransformer裏面我需要訪問我的數據庫。我的問題是,我如何注入或訪問提供MyClaimsTransformer內部數據訪問的範圍服務?

+0

你需要什麼範圍取回?請求範圍還是自定義的? –

+0

@Dovydas Navickas我需要請求範圍,因爲我想抓取一個使用實體框架的存儲庫服務,並且我想確保它在請求結束時被丟棄。 – user3766657

回答

0

我認爲現在是不可能的。

你使用的方法的實現可以發現here

public static IApplicationBuilder UseClaimsTransformation(this IApplicationBuilder app, Func<ClaimsPrincipal, Task<ClaimsPrincipal>> transform) 
{ 
    if (app == null) 
    { 
     throw new ArgumentNullException(nameof(app)); 
    } 
    if (transform == null) 
    { 
     throw new ArgumentNullException(nameof(transform)); 
    } 

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

正如你所看到的,它是提供ClaimsTransformationOptions唯一的財產Transformer一個簡單的代理方法。

而當你只有ClaimsPrincipal,你不能達到它的要求。

可能是你,誰提交了這個問題,但如果它不是,你可以跟蹤它here

+0

是的,我不確定這是設計中的疏忽還是我錯過了,因爲在我看來,如果沒有注入,您無法進行任何有意義的索賠轉換,因爲您無法訪問數據。 – user3766657

+0

思維接受答案,因爲它是暫時正確的答案。每當有變化,我都會更新它。 –

+0

RC1很難理解,沒有人想到如何處理這種情況。如果在下週末沒有解決方案,我會接受你的答案。 – user3766657

1

從@ dovydas-navickas的答案中鏈接到的問題現已解決。

在ASP.NET Core 1.0-RC2中,接口IClaimsTransformer已更新爲採用ClaimsTransformationContext,它提供了一種通過HttpContext訪問服務的方式。

舉例來說,如果你需要訪問內存緩存,它可以像這樣

public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
{ 
    IMemoryCache cache = context.Context.RequestServices.GetService<IMemoryCache>(); 

    // ... the rest of the implementation. 
} 
相關問題