Ответ 1
Лучший способ добиться этого - иметь сервер авторизации (webAPI, генерирующий токен) и среднюю рекламу потребления токенов в вашем проекте MVC. Идентификационный сервер https://github.com/IdentityServer/IdentityServer3 должен помочь. Однако я сделал это как ниже
Построен сервер авторизации с использованием JWT с API-интерфейсом WEB и идентификатором ASP.Net, как описано здесь http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/
после того, как вы сделаете так, чтобы ваш startup.cc вашего веб-сайта выглядел ниже
//Настраивает файл cookie для веб-приложений и JWT для SPA, мобильных приложений
private void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
// Configure the db context, user manager and role manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
//Cookie for old school MVC application
var cookieOptions = new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true, // JavaScript should use the Bearer
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/api/Account/Login"),
CookieName = "AuthCookie"
};
// Plugin the OAuth bearer JSON Web Token tokens generation and Consumption will be here
app.UseCookieAuthentication(new CookieAuthenticationOptions());
OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
//For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(30),
Provider = new CustomOAuthProvider(),
AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["JWTPath"])
};
// OAuth 2.0 Bearer Access Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
}
Здесь вы можете найти классы CustomOAuthProvider, CustomJwtFormat https://github.com/tjoudeh/AspNetIdentity.WebApi/tree/master/AspNetIdentity.WebApi/Providers
Напишите логику потребления (т.е. промежуточное ПО) во всех моих других API (серверах ресурсов), которые вы хотите защитить, используя тот же токен. Поскольку вы хотите использовать токен, сгенерированный webAPI в вашем проекте MVC, после внедрения сервера авторизации вам нужно сделать ниже
В приложении MVC добавьте ниже в startup.cs
public void Configuration(IAppBuilder app)
{
ConfigureOAuthTokenConsumption(app);
}
private void ConfigureOAuthTokenConsumption(IAppBuilder app)
{
var issuer = ConfigurationManager.AppSettings["AuthIssuer"];
string audienceid = ConfigurationManager.AppSettings["AudienceId"];
byte[] audiencesecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["AudienceSecret"]);
app.UseCookieAuthentication(new CookieAuthenticationOptions { CookieName = "AuthCookie" , AuthenticationType=DefaultAuthenticationTypes.ApplicationCookie });
//// Api controllers with an [Authorize] attribute will be validated with JWT
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Passive,
AuthenticationType = "JWT",
AllowedAudiences = new[] { audienceid },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, audiencesecret)
}
});
}
В вашем MVC-контроллере, когда вы получаете де-сериализацию этого токена и генерируете cookie из токена доступа
AccessClaims claimsToken = new AccessClaims();
claimsToken = JsonConvert.DeserializeObject<AccessClaims>(response.Content);
claimsToken.Cookie = response.Cookies[0].Value;
Request.Headers.Add("Authorization", "bearer " + claimsToken.access_token);
var ctx = Request.GetOwinContext();
var authenticateResult = await ctx.Authentication.AuthenticateAsync("JWT");
ctx.Authentication.SignOut("JWT");
var applicationCookieIdentity = new ClaimsIdentity(authenticateResult.Identity.Claims, DefaultAuthenticationTypes.ApplicationCookie);
ctx.Authentication.SignIn(applicationCookieIdentity);
Создайте машинный ключ и добавьте его в web.config вашего сайта webAPI и ASP.Net MVC.
С этим будет создан файл cookie и атрибут [Authorize] в MVC Site и WebAPI будут отмечать этот файл cookie.
P.S. - Я сделал это с помощью веб-API, выдающего JWT (сервер авторизации или сервера Auth и ресурсов) и успешно использующийся на веб-сайте ASP.Net MVC, сайт SPA, построенный в Angular, защищенные API, встроенные в python (сервер ресурсов), spring (сервер ресурсов), приложение для Android.