web-dev-qa-db-ja.com

CORSはOWIN認証を使用するWeb APIで動作しません

私のアプリケーションでは、CORSサポートを使用したトークンベースの認証でWeb APIを使用していますが、クライアントがトークンをリクエストすると、CORS(クロスオリジンリクエストブロック:同じオリジンポリシーが(私のサイトこれは、リソースを同じドメインに移動するか、CORSを有効にすることで修正できます。)

CORSサポートに必要なすべてを構成しました(そう思います)。ここで私の設定

Owinスタートアップクラス

   public class Startup
    {
        public void Configuration(IAppBuilder app)
        {


            var config = new HttpConfiguration
            {
                DependencyResolver = new StructureMapWebApiDependencyResolver(container)

            };


            WebApiConfig.Register(config);  // registering web api configuration
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);  // cors for owin token pipeline
            app.UseWebApi(config);
            ConfigureOAuth(app);


        }

        public void ConfigureOAuth(IAppBuilder app)
        {
            var oAuthAuthorizationServerOptions = new OAuthAuthorizationServerOptions()
            {

                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = new SimpleAuthorizationServerProvider()
            };
            // Token Generation
            app.UseOAuthAuthorizationServer(oAuthAuthorizationServerOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        }
    }

そして、私のwebapi設定

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.EnableCors();  // Corse support for Web api
            config.MapHttpAttributeRoutes(); // attribute based urls

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

        }
    }

ここでweb.configの設定

<system.webserver>
 <httpProtocol>
      <customHeaders>
        <!-- Adding the following custom HttpHeader will help prevent CORS from stopping the Request-->
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
      </customHeaders>
    </httpProtocol>
</system.webserver>

mozillaからのリクエストヘッダー

Accept  application/json, text/plain, */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length  67
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    talenterp
Origin  http://192.168.1.11:85
Referer http://192.168.1.11:85/
User-Agent  Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0

アプリのURLは

サーバーアプリ(CORSをサポートする必要があります)

{http://talenterp}

トークンのエンドポイント:

{http://talenterp/token}

クライアントアプリ

{http://talentmvc:85}

NB:私はすでに追加しました

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

authorizationServerProviderのGrantResourceOwnerCredentials()メソッドで

17
Binson Eldhose

あなただけを持っていることを確認してください

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

構成され、notまた、Global.asaxまたはWebApiConfigの古いスタイル「config.EnableCors()」さらに:上記のステートメントをowin Startupクラスの最初のステートメントとして配置します。はい、それは本当に違いを生みます。後で設定すると、CORが機能しなくなる可能性があります。

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

        ... etc
59

OWINとMicrosoft.AspNet.WebApi.Corsは2つの個別のライブラリであり、それぞれに個別の構成が必要です。

OWINでのCORSの使用を無効にします。

public void Configuration(IAppBuilder app)
{
        //app.UseCors(CorsOptions.AllowAll);

GrantResourceOwnerCredentialsメソッドを見つけ、Access-Control-Allow-Originをコンテキストに追加して、認証が完了した後に呼び出しが返されたときに、ブラウザーがヘッダーを見つけて受け入れるようにします。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" });

次に、Microsoft.AspNet.WebApi.CorsパッケージをNugetからwebapiプロジェクトにインストールし、これをRegisterメソッドに追加します

public static void Register(HttpConfiguration config)
{
        var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,Origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");

        config.EnableCors(cors);

これは私のためにそれをしました。

5
Dado Kljuco

特に、CORSの使用時にWeb APIベアラートークンに問題がある場合は、許可されたメソッドのリストに「トークン」を入れることを忘れないでください。

Web.configのsystem.webServerにコードを入れてください、それが私の解決方法です

<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE, TOKEN" />
 </customHeaders>
2