Не удалось получить данные httpactioncontext.
У меня есть служба веб-api, написанная на .net framework 4.6.2, и только мобильный доступ к этой веб-службе. Однако только для входа в мобильный доступ другой веб-сервис написан .net standard 2. я могу получить токен с сервера, но когда я пытаюсь расшифровать токен на стороне .net framework, аутентификация завершается неудачей.
Ниже приведен код на стороне .net framework.
public class CustomAuthorize : System.Web.Http.AuthorizeAttribute { public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { var ss = actionContext.Request.Headers; if (!actionContext.RequestContext.Principal.Identity.IsAuthenticated) throw new UnauthorizedAccessException(); base.OnAuthorization(actionContext); var principal = actionContext.RequestContext.Principal.Identity as System.Security.Claims.ClaimsIdentity; CustomPrincipal user = new CustomPrincipal(principal.Claims); // TODO: Check Role Feature System.Threading.Thread.CurrentPrincipal = user; } }
Ниже приводится start.cs в приложении веб-службы .net framework, где установлен токен
var securityKey = ConfigurationManager.AppSettings.Get("SecurityKey"); var key = System.Text.Encoding.UTF8.GetBytes(securityKey); var signingKey = new SymmetricSecurityKey(key); var audience = ConfigurationManager.AppSettings.Get("Audience"); var issuer = ConfigurationManager.AppSettings.Get("Issuer"); var val = new Microsoft.Owin.Security.Jwt.SymmetricKeyIssuerSecurityTokenProvider(issuer, key); var tokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() { ValidIssuer = val.Issuer, ValidAudience = audience, ValidAudiences = new string[] { audience }, ValidIssuers = new string[] { issuer }, ValidateIssuerSigningKey = true, ValidateIssuer = true, ValidateAudience = true, IssuerSigningTokens = val.SecurityTokens, ClockSkew = TimeSpan.Zero }; app.UseJwtBearerAuthentication(new Microsoft.Owin.Security.Jwt.JwtBearerAuthenticationOptions { TokenValidationParameters = tokenValidationParameters });
Следующее находится на стороне .net standard startup.cs, где настраиваются параметры
private void AddCustomJwtBearer(IServiceCollection services, TokenSetting tokenSetting) { var securityKey = tokenSetting.SecretKey; var key = Encoding.UTF8.GetBytes(securityKey); var signingKey = new SymmetricSecurityKey(key); var tokenValidationParameters = new TokenValidationParameters() { ValidAudiences = new string[] { tokenSetting.Audience }, ValidIssuers = new string[] { tokenSetting.Issuer }, ValidateIssuerSigningKey = true, IssuerSigningKey = signingKey, ClockSkew= TimeSpan.Zero }; services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { context.Response.Headers.Add("x-tokenstatus-header", "fail"); return Task.CompletedTask; } }; options.Audience = tokenSetting.Audience; options.RequireHttpsMetadata = tokenSetting.RequireHttpsMetadata; options.TokenValidationParameters = tokenValidationParameters; }); }
Кто-нибудь может мне помочь? Пожалуйста, я застрял здесь на некоторое время. Если вы сделаете еще какие-нибудь коды, пожалуйста, дайте мне знать.
Что я уже пробовал:
Я старался сделать все похожим.
//var tokenValidationParameters2 = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() //{ // ValidAudiences = new string[] { audience }, // ValidIssuers = new string[] { issuer }, // ValidateIssuerSigningKey = true, // IssuerSigningKey = signingKey, // ClockSkew = TimeSpan.Zero //};
Вышеприведенный код также не был согласован.