Токен-носитель jwtBearer с обновлением rc-1 для ASP.Net 5

У меня много проблем с тем, чтобы мое веб-приложение asp.net 5 могло принимать JWT tokens, У меня есть код, уже полностью работоспособный с использованием mvc5, и я просто хочу, чтобы некоторая помощь по преобразованию этого кода была идентична, но работа с mvc6 Он настроен так, что мой клиент (веб-сайт) является доверенным приложением и использует IssuerSigningToken проверить статус доверенного приложения, и после этого я могу просто передать JWT tokens и получить информацию о пользователе и претензиях с сервера авторизации.

старый код:

public void Configuration(IAppBuilder app)
{
    HttpConfiguration httpConfig = new HttpConfiguration();
    app.UseJwtBearerAuthentication(new MyJwtOptions());
    app.UseWebApi(httpConfig);
    ConfigureWebApi(httpConfig);
    app.UseWebApi(httpConfig);
}

public class MyJwtOptions : JwtBearerAuthenticationOptions
{
    public MyJwtOptions()
    {
        var issuer = "https://tv.domain.com/trust/domain";
        var audience = "https://www.domain.com/";
        var key = Convert.FromBase64String("dW8E7DDKW34DDW33jg=");
        AllowedAudiences = new[] {audience};
        IssuerSecurityTokenProviders = new[] {new SymmetricKeyIssuerSecurityTokenProvider(issuer, key)};
    }
}

Лучший пример, который я могу найти, - это здесь - JwtBearerSample

        app.UseJwtBearerAuthentication(options =>
        {
            options.AutomaticAuthenticate = true;
            options.AutomaticChallenge = true;
            // You also need to update /wwwroot/app/scripts/app.js
            options.Authority = Configuration["jwt:authority"];
            options.Audience = Configuration["jwt:audience"];
        });

Я не могу понять, если я близко или нет, моя главная проблема заключается в том, как добавить IssuerSignerToken? я использую Thinktecture и не похоже, что у них есть новый обновленный пример. Кто-нибудь выполнил то, что я пытаюсь сделать? Я знаю, что есть несколько других подобных вопросов, но ответы на них используют X.509 Certificates Я бы предпочел, если возможно, использовать тот же строковый ключ для IssuerSignerToken

ОБНОВИТЬ

моя проблема в том, какие опции я использовал, унаследованные от Microsoft.Owin.Security.JwtBearerAuthenticationOptions новый код ожидает Microsoft.AspNet.Authentication.JwtBearer.JwtBearerOptions

3 ответа

Решение

Чтобы использовать симметричный ключ, вам нужно перейти на ночные сборки RC2 (изначально он не будет работать с RC1).

Вот как вы можете указать ключ эмитента, необходимый для проверки токенов JWT (вам не нужно создавать подклассы JwtBearerOptions или же JwtBearerAuthenticationOptions для этого):

var key = Convert.FromBase64String("dW8E7DDKW34DDW33jg=");

app.UseJwtBearerAuthentication(options => {
    options.AutomaticAuthenticate = true;
    options.AutomaticChallenge = true;

    options.Authority = Configuration["jwt:authority"];
    options.Audience = Configuration["jwt:audience"];

    options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(key);
});

Ответ Пинпойнта совершенно верный, хотя я подумал, что мог бы добавить к этому и избежать многих часов неприятных проблем, заставляя это работать.

не устанавливайте ничего в собственность Authority

// even if everything else is properly set you will get 500
// some demos tell you to put CLientId here , that is wrong
options.Authority = "";

вы не можете устанавливать конфигурации напрямую, вы должны создать новый объект конфигурации следующим образом:

 options.Configuration = new Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration()
 {
     Issuer = "https://tv.domain.com/trust/domain"
 };

в MVC5 вы бы использовали System.Security.Claims в вашем контроллере, чтобы получить текущего пользователя так:

var user = ClaimsPrincipal.Current;

это больше не будет работать, теперь вы добавите это в контроллер:

var user = User.Identity;

Вы можете использовать это так:

 app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = clientIds,
                IssuerSecurityKeyProviders = new IIssuerSecurityKeyProvider[]
                {
                    new SymmetricKeyIssuerSecurityKeyProvider(issuer, key)
                }
            });
Другие вопросы по тегам