【问题标题】:Authorize Filter in Web Api 2.0 With OauthBearerTokens Not Working使用 OauthBearerTokens 在 Web Api 2.0 中授权过滤器不起作用
【发布时间】:2014-11-19 20:20:15
【问题描述】:

我有一个使用 OAuthBearerToken 样式身份验证的单页应用程序(Angular Js + AspNet Web API)

我的代码如下

[assembly: OwinStartupAttribute(typeof(App.Web.Startup))]
namespace App.Web
{
    public partial class Startup
    {
     public void Configuration(IAppBuilder app)
      {
        var config = new HttpConfiguration();
        config.SuppressDefaultHostAuthentication();


        config.Formatters.Remove(config.Formatters.XmlFormatter);
        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();


        config.Filters.Add(new ValidateModelStateAttribute());
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        //register autofac
        var builder = new ContainerBuilder();

        builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterFilterProvider();
        builder.RegisterModelBinderProvider();

        builder.RegisterWebApiFilterProvider(config);
        builder.RegisterWebApiModelBinders(Assembly.GetExecutingAssembly());
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());


        var container = builder.Build();
        var resolver = new AutofacWebApiDependencyResolver(container);
        config.DependencyResolver = resolver;
        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);
        app.UseWebApi(config);
        ConfigureOAuth(app, container);
    }

     public void ConfigureOAuth(IAppBuilder app, IContainer container)
      {
        var oAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),

            Provider = container.Resolve(typeof(SimpleAuthorizationServerProvider)) as IOAuthAuthorizationServerProvider
        };
        app.UseOAuthBearerTokens(oAuthServerOptions);
        app.UseOAuthAuthorizationServer(oAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    }
}

}

我的 SimpleAuthorizationProvider 实现如下所示

 public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
  {

    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

    {
        context.Validated();

    }
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] {"*"});

        var userManager = context.OwinContext.GetAutofacLifetimeScope().Resolve<IUserStore<User>>() as UserStore;
        if (userManager != null)
        {
            var user = await userManager.FindByNameAsync(context.UserName);

            if (user == null)
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }
            var phash = await userManager.GetPasswordHashAsync(user);
            //the hash of the incoming password
            var passwordHasher = new PasswordHasher();
            var result = passwordHasher.VerifyHashedPassword(phash, context.Password);

            if (result == PasswordVerificationResult.Success)
            {
                var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                identity.AddClaim(new Claim(ClaimTypes.Sid, user.Id.ToString()));
                identity.AddClaim(new Claim(ClaimTypes.Email, user.UserName));
                context.Validated(identity);
                               }
            else
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");

            }

        }
    }


}

现在问题来了 当我向 /token 端点发出发布请求时。一切正常,我得到一个不记名令牌返回

每当我尝试访问使用授权属性注释的操作方法时,HTTP 授权标头设置为 Bearer {access_token},我都会收到消息

“此请求的授权已被拒绝”。

请问我做错了吗?

【问题讨论】:

  • 我也有同样的问题。你找到解决方案了吗?

标签: asp.net angularjs asp.net-web-api oauth-2.0 asp.net-identity-2


【解决方案1】:

您应该使用 Bearer 方案在 Authorization 标头中发送令牌。

我猜您将它作为查询字符串的一部分发送,这就是您的受 API 保护的端点不理解它的原因。请查看我关于 AngularJS authentication with Web API 的详细帖子,其中涵盖了您的确切情况。

【讨论】:

    【解决方案2】:

    您的项目中有WebApiConfig.cs 文件,其中包含Register(HttpConfiguration config) 方法吗?

    如果你这样做,那么它应该包含以下内容:

    public static void Register(HttpConfiguration config)
    {      
      // Move config.SuppressDefaultHostAuthentication() from Startup::Register method to this method
      config.SuppressDefaultHostAuthentication();
    
      // Add a filter handling "Bearer" authentication to the known filters
      config.Filters.Add(new HostAuthenticationFilter("Bearer"));
    }
    

    我遇到了和你一样的问题,已经解决了。 解决方案由https://stackoverflow.com/a/34166821/867600带来。

    【讨论】:

      【解决方案3】:

      如何在请求中传递标头?应该是

      授权:承载 imSXTs2OqSrGWzsFQhIXziFCO3rF...

      // If we already have a bearer token, set the Authorization header.
      var token = sessionStorage.getItem(tokenKey);
      var headers = {};
      if (token) {
          headers.Authorization = 'Bearer ' + token;
      }
      
      $.ajax({
      type: 'GET',
      url: 'api/values/1',
      headers: headers
      }).done(function (data) {
      self.result(data);
      }).fail(showError);
      

      看到这个link,它有一个很好的细节。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-07-18
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多