ASP.NET Web Api在获取跨源令牌时出现问题

本文关键字:令牌 问题 Web NET Api 获取 ASP | 更新日期: 2023-09-27 18:24:14

我在使用跨源代码从前端(Node.js和Ajax)登录Web Api时遇到了一些问题。我得到以下错误:

XMLHttpRequest cannot load http://localhost:61102/Token. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 500.

只有当我尝试调用/Token登录时才会出现这个问题。我可以访问其他路由并完美注册。这是我的代码:

Startup.cs:

public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();
    ConfigureAuth(app);
    WebApiConfig.Register(config);
    app.UseCors(CorsOptions.AllowAll);
    app.UseWebApi(config);
}

Startup.Auth.cs:

public void ConfigureAuth(IAppBuilder app)
{
    // Configure the db context and user manager to use a single instance per request
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    // Enable the application to use a cookie to store information for the signed in user
    // and to use a cookie to temporarily store information about a user logging in with a third party login provider
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    // Configure the application for OAuth based flow
    PublicClientId = "self";
    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        TokenEndpointPath = new PathString("/Token"),
        Provider = new ApplicationOAuthProvider(PublicClientId),
        AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
        // In production mode set AllowInsecureHttp = false
        AllowInsecureHttp = true
    };
    // Enable the application to use bearer tokens to authenticate users
    app.UseOAuthBearerTokens(OAuthOptions);
}      

我已经将context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });放入ApplicationOAuthProvider.cs 中的GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

很长一段时间以来,我一直在努力寻找答案,但却偶然发现了很多不同的答案,这些答案对我来说都不起作用。我不确定出了什么问题。

更新-添加了我的ajax脚本

import {URL} from '../constants/AuthConstants';
import request from 'reqwest';
import history from './HistoryService';
let router = null;
class AuthService {
    login(email, password) {
        console.log(URL.LOGIN);
        var grant_type = 'password';
        return request({
            url: URL.LOGIN,
            method: 'POST',
            crossOrigin: true,
            content-Type
            data: {
                grant_type, email, password
            },
            success: function(response) {
                console.log("Yay! Login", response);
            },
            error: function(response) {
                console.log("Error! Login", response);
            }
        });
    }
}

ASP.NET Web Api在获取跨源令牌时出现问题

您使用的CORS与我过去使用的有点不同。我已经做了很多次,并取得了相对的成功。

在WebApi项目中添加对System.Web.Cors的引用,并在WebApiConfig.cs文件中将以下内容添加到Register方法中:

public static void Register(HttpConfiguration config)
{
    config.SetCorsPolicyProviderFactory(new CorsPolicyFactory());
    config.EnableCors();
    // Web API routes
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );                     
}

更多的深度教程可以在这里找到:

http://tostring.it/2014/03/04/how-to-use-CORS-with-ASPNET-WebAPI-2/

http://enable-cors.org/server_aspnet.html

天哪,我成功了。但不确定它是否好或正确的方法(可能不是,但它有效)。我愤怒地删除了代码中的app.UseCors(CorsOptions.AllowAll);和所有其他启用cors的内容,并将其添加到<system.webServer>:中的web.config中

<httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://localhost:8080"/>
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
      </customHeaders>
    </httpProtocol>

我会把它标记为答案,因为它有效,但由于我不确定这是否是解决这个问题的正确方法,请告诉我是否正确,我会更改"正确答案"的内容。

编辑-正确的方法

使用上面的方法,我可以注册和登录,但不能执行其他调用,例如"api/values/1"(因为它在发送"GET"或其他东西之前发送了"OPTIONS",我不想为其创建处理程序)。我所做的事情被改回了一些旧代码,我已经尝试了很多次,但以前不起作用。

我从Web.config中删除了httpProtocol。

我将WebApiConfig更新为:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

在GrantResourceOwnerCredentials()中的ApplicationOAuthProvider.cs中,我在函数的顶部添加了此行:

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

这是一些完全相同的代码,我以前尝试过很多次,但这次我不知道是什么让它工作。我登录了我的电脑,当我回来试用时,它突然工作了。这里有一些伏都教的东西,但这可能是正确的方法。