当前位置: 首页 > 知识库问答 >
问题:

在asp.net5(vNext)中防止基于令牌的预检OPTIONS请求授权

孙琨
2023-03-14

我在 asp.net 5(RC1)中几乎实现了OAuth2。我的解决方案基于Mark Hughes在 ASP.NET 5(vNext)中基于令牌的身份验证中给出的代码,这非常出色。

我的问题是我的设置使用CORS请求,几乎每个请求之前都有一个OPTIONS请求。即使我只将Authorize属性应用于GetAll控制器操作/方法,如下所示,前面的OPTIONS请求也被授权了。

[Route("api/[controller]")]
public class TextController : Controller
{
    [HttpGet]
    [Authorize("Bearer", Roles = "admin")]
    public IEnumerable<string> GetAll()
    {
        return _repository.GetAll;
    }

    ...
}

授权服务设置正在启动。cs看起来是这样的:

services.AddAuthorization(auth =>
        {
            auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
                .RequireAuthenticatedUser().Build());
        });

有什么方法可以更改授权中间件的行为以跳过OPTIONS请求的授权吗?

注意:

我尝试过创建自己的授权属性,但由于某种原因,IsAuthicated 的计算结果总是为 false,就好像在到达此代码时授权尚未发生一样:

public class BearerAuthorizationAttribute : Attribute, IAuthorizationFilter
{
    private readonly string Role;
    public BearerAuthorizationAttribute(string Role = null)
    {
        this.Role = Role;
    }
    [Authorize("Bearer")]
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
    {
        string meth = context.HttpContext.Request.Method;
        if (meth != "OPTIONS")
        {

            if (!context.HttpContext.User.Identity.IsAuthenticated)
            {
                context.Result = new ContentResult() { Content = "Unauthorized", StatusCode = 401 };
                return;
            }
            if (Role != null && !context.HttpContext.User.IsInRole(Role))
            {
                context.Result = new ContentResult() { Content = "Unauthorized, role level insufficient", StatusCode = 401 };
                return;
            }
        }

    }
}

共有1个答案

璩浩广
2023-03-14

我终于想出了如何解决我的问题。在我的Startup.cs中,我使用了services.AddCors,如下所示:

// Create CORS policies
services.AddCors(options =>
{
    // Define one or more CORS policies
    options.AddPolicy("AllowSpecificOrigin",
        builder =>
        {
            builder.WithOrigins(Configuration.Get<string[]>("AppSettings:AllowedOrigins")) // TODO: revisit and check if this can be more strict and still allow preflight OPTION requests
                        .AllowAnyMethod() 
                        .AllowAnyHeader();
        }
    );
});
// Apply CORS policy globally
services.Configure<MvcOptions>(options =>
{
    options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
});

事实证明,这只起到了部分作用。

我的解决方案是做< code>app。请改用Cors,即删除上面的代码并执行以下操作:

app.UseCors(builder =>
{
    builder.WithOrigins(Configuration.Get<string[]>("AppSettings:AllowedOrigins")) // TODO: revisit and check if this can be more strict and still allow preflight OPTION requests
        .AllowAnyMethod()
        .AllowAnyHeader();
});

当使用app.UseCors时,我得到了完全有效的CORS处理,它会在OPTIONS请求被授权之前反弹它们。

该解决方案的灵感来自CORS无法在具有OWIN身份验证的Web API中工作。

 类似资料:
  • 问题内容: 我想为基于Struts 1.x框架的Web应用程序实施跨站点请求伪造预防。我知道struts 2框架为此提供了令牌拦截器,并且可以使用过滤器实现类似的功能。 我对一些想法感到困惑1)如何以简单的方式生成唯一令牌?(我可以为此目的使用Action类令牌来避免重复提交表单) 将struts 1.x框架令牌机制用于CSRF预防是否存在任何问题 问题答案: Struts 1 Action令牌方

  • 我真的很难找到一个AWS设计,让我: 使用REST(不使用AWS sdk库)向cognito验证实体。 cognito的RESTAPI需要识别实体并根据实体返回结果。例如,像“getOrders”这样的api将返回与已登录的实体关联的订单 经评估的解决方案: > 具有作用域的oAuth身份验证无法解决此场景。实体必须使用appclientId和secret进行身份验证,因此不清楚如何区分实体(为所

  • 试图让OAuth2谷歌登录工作,这是我的应用程序发出的原始请求: : : : : 这是回应: 状态: null 对此的帮助将不胜感激。我试图在我的应用程序中设置OAuth2支持的“用X登录”功能,已经让脸书和推特没有问题地工作,也想让谷歌工作,但如果我不能解决这个问题,我恐怕我将不得不放弃谷歌Auth。

  • 我使用springfox 2.9.2我有这样的api: 女巫来自身份验证服务器。我尝试在swagger中首次调用此服务器,并将其传递给像上面这样的控制器请求。所以我做 在Swagger ui上,授权调用成功返回了令牌,但它没有将令牌添加到请求头中。它会产生 如果我像这样设置令牌:

  • 本文向大家介绍php基于session锁防止阻塞请求的方法分析,包括了php基于session锁防止阻塞请求的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php基于session锁防止阻塞请求的方法。分享给大家供大家参考,具体如下: 说明: 这是一篇参考国外网站http://konrness.com/php5/how-to-prevent-blocking-php-reques