gpt4 book ai didi

c# - 使用 Owin 中间件添加声明

转载 作者:太空狗 更新时间:2023-10-29 19:45:18 25 4
gpt4 key购买 nike

Owin 中间件实现是否可以在执行 Web API Controller 之前添加声明?

创建了一个 OwinMiddleware 实现并添加了一个身份:

 var id = new ClaimsIdentity();
id.AddClaim(new Claim("Whatever", "is possible"));
context.Authentication.User.AddIdentity(id);

await Next.Invoke(context);

但是,即使这个Invoke 方法调用身份也不会更新(只是内部声明数组)。 Controller 在执行时当然不会得到新的虚拟声明。

想法?

最佳答案

已经有一个类可以提供声明丰富 ClaimsAuthenticationManager,您可以对其进行扩展,以便它处理特定于域的声明,例如...

public class MyClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}

return AddApplicationClaims(incomingPrincipal);
}

private ClaimsPrincipal AddApplicationClaims(ClaimsPrincipal principal)
{
// TODO: Add custom claims here based on current principal.

return principal;
}
}

下一个任务是提供适当的中间件来调用它。对于我的项目,我编写了以下类...

/// <summary>
/// Middleware component to apply claims transformation to current context
/// </summary>
public class ClaimsTransformationMiddleware
{
private readonly Func<IDictionary<string, object>, Task> next;
private readonly IServiceProvider serviceProvider;

public ClaimsTransformationMiddleware(Func<IDictionary<string, object>, Task> next, IServiceProvider serviceProvider)
{
this.next = next;
this.serviceProvider = serviceProvider;
}

public async Task Invoke(IDictionary<string, object> env)
{
// Use Katana's OWIN abstractions
var context = new OwinContext(env);

if (context.Authentication != null && context.Authentication.User != null)
{
var manager = serviceProvider.GetService<ClaimsAuthenticationManager>();
context.Authentication.User = manager.Authenticate(context.Request.Uri.AbsoluteUri, context.Authentication.User);
}

await next(env);
}
}

然后是接线延长...

public static class AppBuilderExtensions
{
/// <summary>
/// Add claims transformation using <see cref="ClaimsTransformationMiddleware" /> any depdendency resolution is done via IoC
/// </summary>
/// <param name="app"></param>
/// <param name="serviceProvider"></param>
/// <returns></returns>
public static IAppBuilder UseClaimsTransformation(this IAppBuilder app, IServiceProvider serviceProvider)
{
app.Use<ClaimsTransformationMiddleware>(serviceProvider);

return app;
}
}

我知道这是服务定位器反模式,但使用 IServiceProvider 是容器中立的,似乎是将依赖项放入 Owin 中间件的公认方式。

最后,您需要在您的 Startup 中连接它,下面的示例假定 Unity 并注册/公开一个 IServiceLocator 属性...

// Owin config
app.UseClaimsTransformation(UnityConfig.ServiceLocator);

关于c# - 使用 Owin 中间件添加声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com