Позвольте мне начать с краткого описания того, как работает OWIN.Вам стоит больше узнать об этом, но это хорошая отправная точка.
Думайте о OWIN как о конвейере между запросом и вашим приложением, которое в данном случае является MVC Web Api.Каждый фрагмент конвейера называется промежуточным программным обеспечением, и запрос проходит через этот конвейер, пока не достигнет вашего приложения.Когда запрос достигает конвейера, поток переворачивается, и данные возвращаются обратно через конвейер.Таким образом, каждый фрагмент этого конвейера («промежуточное программное обеспечение») видит данные дважды, когда данные поступают в приложение и когда они покидают приложение.Промежуточное программное обеспечение может просматривать или изменять запрос, когда он поступает, или просматривать или изменять ответ, когда оно покидает ваше приложение, или и то и другое.
Каждый компонент промежуточного программного обеспечения получает словарь, содержащий различные фрагменты данных о запросе.и ответ, и делегат, который вызывает следующий фрагмент конвейера.
Теперь для вашего кода:
Ваше приложение - WebApi, как определено этими строками:
app.UseWebApi(AppConfiguration);
У вас есть два промежуточных ПО, которые вы инициализируете этими строками:
var issuer = ConfigurationManager.AppSettings["as:IssuerServer"];
var tokenEndpoint = ConfigurationManager.AppSettings["as:OwinTokenEndpoint"]; // "/oauth/token"
OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions()
{
////For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new Microsoft.Owin.PathString(tokenEndpoint),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new CustomOAuthProvider(),
AccessTokenFormat = new CustomJwtFormat(issuer)
};
// OAuth 2.0 Bearer Access Token Generation
this.app.UseOAuthAuthorizationServer(oAuthServerOptions);
, а затем эти строки:
string audienceId = ConfigurationManager.AppSettings["as:AudienceId"];
var issuer = ConfigurationManager.AppSettings["as:IssuerServer"]; // Should have the Url of the auth server http://localhost:53025/";
byte[] audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["as:AudienceSecret"]);
this.app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audienceId },
IssuerSecurityKeyProviders = new IIssuerSecurityKeyProvider[]
{
new SymmetricKeyIssuerSecurityKeyProvider(issuer, audienceSecret)
}
});
Это промежуточное ПО всегда будет работать.Не имеет значения, есть ли у вас какие-либо атрибуты.
Вы сказали, что ошибка не возникает на локальных машинах разработки, что означает, что у вас, скорее всего, есть проблема с конфигурацией.Вы передаете настройки в ваше промежуточное ПО в указанных выше строках.
Исходя из этого, я подозреваю, что у вас проблема с переменными issuer
или tokenEndpoint
или (что более вероятно) с audienceId
илиaudienceSecret
переменных.
Надеюсь, это поможет.