gpt4 book ai didi

security - 我应该在 Asp.net WebAPI 中的哪里插入授权?

转载 作者:行者123 更新时间:2023-12-02 01:34:15 25 4
gpt4 key购买 nike

据我所知,我有 3 个可能的地方可以将我的东西插入管道

1)     AuthorizationFilters

2) Action Filters

3) DelegatingHandler

最明显的是 AuthorizationFilters ,我可以在其中使用自定义授权属性来装饰我的操作/ Controller 。说.. MyCustomAuthorizationAttribute .

因为 HTTP 消息处理程序处于处理管道的第一阶段。把它放在那里有意义吗?

现在对我来说授权只是意味着检查 header 中的 token ,该 token 在身份验证后提供给客户端。

最佳答案

2014 年 7 月更新

我原来的答案涵盖了 WebApi 1。WebApi 2 发生了一些变化,即现在有一个 IAuthenticationFilter ,这意味着您可以将身份验证逻辑移出 DelegatingHandler ,这是一个更优雅一点。

有一个Nuget项目here它提供了 IAuthenticationFilter 的实现,并解释了其介绍的一些背景。

OWIN 中间件现在可能是实现身份验证逻辑的最佳位置 - 有一个证书身份验证示例 here和基本身份验证 OWIN 中间件位于 this blog post前一个示例是首选示例,因为它演示了 AuthenticationHandler 基类的使用。

有关 AuthorizationFilters 的建议基本保持不变。

结束更新

通常...

使用DelegatingHandler来执行身份验证...即某人是谁。使用它来设置线程和用户上下文的原理,添加声明等。您也可以在此处放置授权逻辑,但在相当全局的范围内。我个人总是使用 AuthorizationFilters 进行授权。

使用AuthorizationFilters将 Controller 和操作限制为特定人员。当您可以使用声明、主体、url 或 http 请求参数中的信息推断其权限时,将使用这些。默认授权过滤器可用于限制对匿名用户或角色的访问(如果在委托(delegate)处理程序之类的东西中设置) - 显然,如果需要,您也可以实现自己的 AuthorizationFilters。

当您需要使用消息内容(例如:您需要访问实体的属性来决定他们是否有权访问(显然要小心这个(!))。

注意:

AuthorizationFilters 是在读取正文内容之前调用的,因此它们无权访问消息正文以做出授权决策,这就是为什么 ActionFilters 特别是OnActionExecuting 用于偶尔引发身份验证错误。

所以

在您的场景中,我会放置一个简单的DelegatingHandler来获取您的 header 并设置主体。

public class CustomAuthenticationMessageHandler : DelegatingHandler
{


public CustomAuthenticationMessageHandler ()
{

}

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
Authenticate(request);

return base.SendAsync(request, cancellationToken);
}

protected virtual void Authenticate(HttpRequestMessage request)
{

var authorisationHeader = request.Headers.Authorization;

if (authorisationHeader == null)
{
return;
}

//Ensure you are happy with the header contents then

{
var principal = new GenericPrincipal(//new Identity , //Roles);
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
}

}
}

然后使用AuthorizationFilters来限制访问:

    [Authorize]
public string Get()
{

}

[Authorize(Roles = "Admin")]
public string GetAdminOnly()
{

}

注册全局身份验证

config.MessageHandlers.Add(new CustomAuthenticationMessageHandler());

这意味着在每个请求中,主体将被设置为 null 或有效身份。它不会处理授权,即不会拒绝对任何 Controller 或操作的访问。

开始保护资源

使用标准或自定义 [Authorize] 属性来定位 protected Controller 和操作。或全局注册:

config.Filters.Add(new AuthorizeAttribute());

并且仅使用 [AllowAnonymous] 属性将您想要不安全的 Controller 和操作列入白名单。

如果您只想在某些路由上进行身份验证

然后您可以稍微修改您的 DelegatingHandler 以将 InnerHandler 设置为路由到正确的 Controller ,例如

public CustomAuthenticationMessageHandler(HttpConfiguration configuration)
{
InnerHandler = new HttpRoutingDispatcher(configuration);
}

然后您可以在路线上指定此处理程序,如下所示:

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "myurl",
defaults: new {},
constraints: new {},
handler: new CustomAuthenticationHandler(config)
);

关于security - 我应该在 Asp.net WebAPI 中的哪里插入授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14871925/

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