私のアプリケーションでは、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()メソッドで
あなただけを持っていることを確認してください
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
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);
これは私のためにそれをしました。
特に、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>