首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我应该在Asp.net WebAPI中的何处插入授权?

我应该在Asp.net WebAPI中的何处插入授权?
EN

Stack Overflow用户
提问于 2013-02-14 17:48:03
回答 1查看 7.8K关注 0票数 25

正如我所看到的,我有3个可能的地方在管道中插入我的东西

代码语言:javascript
代码运行次数:0
运行
复制
1)     AuthorizationFilters

2)     Action Filters

3)     DelegatingHandler

最明显的是AuthorizationFilters,我可以用我的自定义授权属性来装饰我的操作/控制器。比方说..MyCustomAuthorizationAttribute

因为HTTP消息处理程序处于处理流水线的第一阶段。把它放进去有什么意义吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-14 18:42:55

更新2014年7月

我最初的回答涵盖了WebApi 1。在WebApi 2中有一些变化,即现在有了IAuthenticationFilter,这意味着您可以将身份验证逻辑移出DelegatingHandler,这会更优雅一些。

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

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

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

结束更新

通常..。

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

使用AuthorizationFilters将控制器和操作限制为特定人员。当您可以使用声明、主体、url或http请求参数中的信息来推断它们的权限时,就会使用它们。默认授权筛选器可用于限制匿名用户或按角色进行访问(如果设置在委托处理程序中)-显然,如果需要,您也可以实现自己的AuthorizationFilters。

当您需要使用消息内容进行授权决策时,偶尔使用ActionFilters。例如,您需要访问实体上的属性以确定它们是否具有访问权限(显然要小心这个(!))。

注意:

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

So

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

代码语言:javascript
代码运行次数:0
运行
复制
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限制访问:

代码语言:javascript
代码运行次数:0
运行
复制
    [Authorize]
    public string Get()
    {

    }

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

    }

用于注册全局身份验证的

代码语言:javascript
代码运行次数:0
运行
复制
config.MessageHandlers.Add(new CustomAuthenticationMessageHandler());

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

开始保护资源

使用标准或自定义授权属性来定位受保护的控制器和操作。或全局注册:

代码语言:javascript
代码运行次数:0
运行
复制
config.Filters.Add(new AuthorizeAttribute());

并且只使用[AllowAnonymous]属性将您希望不受保护的控制器和操作列入白名单。

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

然后,您可以稍微修改您的DelegatingHandler,以设置InnerHandler路由到正确的控制器,例如

代码语言:javascript
代码运行次数:0
运行
复制
public CustomAuthenticationMessageHandler(HttpConfiguration configuration)
{
       InnerHandler = new HttpRoutingDispatcher(configuration);
}

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

代码语言:javascript
代码运行次数:0
运行
复制
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "myurl",
            defaults: new {},
            constraints: new {},
            handler: new CustomAuthenticationHandler(config)
            );
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14871925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档