У нас есть сайт ASP.Net, который требует аутентификации. Я реализовал код ниже.
Приложению требуется аутентификация по следующим путям:
/admin - ADFS
/edx/links - ADFS
/api - OAuth
Api используется приложением и должно проходить проверку подлинности с помощью OAuth, а не ADFS, но, тем не менее, приложение перенаправляется на сервер ADFS.
Можем ли мы сделать то, что описано на 1 сайте, или мы должны разделить сайт на две части (1 для веб-доступа и API)? Я бы предпочел вариант с 1 сайтом.
public void Configuration(IAppBuilder app)
{
app.UseOwinExceptionLogger();
app.SetLoggerFactory(new OwinLoggerFactory());
var config = new HttpConfiguration { DependencyResolver = new StructureMapResolver(Container) };
var settings = Container.GetInstance<ISettings>();
ConfigureOAuth(app, settings);
app.Map("/admin", inner => ConfigureAuth(inner, settings));
app.Map("/edx/links", inner => ConfigureAuth(inner, settings));
WebApiConfig.Register(config);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(config);
}
private static void ConfigureOAuth(IAppBuilder app, ISettings settings)
{
var oAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
Provider = new SimpleAuthorizationServerProvider(),
RefreshTokenProvider = new SimpleRefreshTokenProvider(),
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.Use(async (context, next) => { await next.Invoke(); });
}
private void ConfigureAuth(IAppBuilder app, ISettings settings)
{
// Work-around to fix Katana issue 197: https://katanaproject.codeplex.com/workitem/197
// https://github.com/KentorIT/owin-cookie-saver
// app.UseKentorOwinCookieSaver();
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
CookieManager = new SystemWebCookieManager()
});
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = settings.WsFedRealm,
MetadataAddress = settings.WsFedMetadataUrl,
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = ClaimsExtensions.WurNameIdentifier,
SaveSigninToken = true
},
Notifications = new WsFederationAuthenticationNotifications
{
MessageReceived = context =>
{
Log.Info($"Message received {context.ProtocolMessage}");
return Task.FromResult(0);
},
RedirectToIdentityProvider = context =>
{
Log.Info($"Redirect to identity provider {context?.Request?.Uri?.AbsolutePath}");
return Task.FromResult(0);
},
SecurityTokenValidated = context =>
{
Log.Info("Security token validated");
return Task.FromResult(0);
},
SecurityTokenReceived = context =>
{
Log.Info($"SecurityTokenReceived {context?.Response?.ReasonPhrase}");
return Task.FromResult(0);
},
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("~/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;
}