@ -3,6 +3,7 @@ using System.Security.Claims;
using Microsoft.AspNet.Authentication ;
using Microsoft.AspNet.Authentication ;
using Microsoft.AspNet.Authentication.Cookies ;
using Microsoft.AspNet.Authentication.Cookies ;
using Microsoft.AspNet.Authentication.Facebook ;
using Microsoft.AspNet.Authentication.Facebook ;
using Microsoft.AspNet.Authentication.JwtBearer ;
using Microsoft.AspNet.Authentication.OAuth ;
using Microsoft.AspNet.Authentication.OAuth ;
using Microsoft.AspNet.Builder ;
using Microsoft.AspNet.Builder ;
using Microsoft.AspNet.Http ;
using Microsoft.AspNet.Http ;
@ -12,7 +13,9 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.OptionsModel ;
using Microsoft.Extensions.OptionsModel ;
using Microsoft.Extensions.WebEncoders ;
using Microsoft.Extensions.WebEncoders ;
using OAuth.AspNet.AuthServer ;
using OAuth.AspNet.AuthServer ;
using OAuth.AspNet.Tokens ;
using Yavsc.Auth ;
using Yavsc.Auth ;
using Yavsc.Extensions ;
using Yavsc.Models ;
using Yavsc.Models ;
namespace Yavsc
namespace Yavsc
@ -26,6 +29,8 @@ namespace Yavsc
public static FacebookOptions FacebookAppOptions { get ; private set ; }
public static FacebookOptions FacebookAppOptions { get ; private set ; }
public static OAuthAuthorizationServerOptions OAuthServerAppOptions { get ; private set ; }
public static OAuthAuthorizationServerOptions OAuthServerAppOptions { get ; private set ; }
public static OAuthOptions OAuthClientOptions { get ; set ; }
public static YavscGoogleOptions YavscGoogleAppOptions { get ; private set ; }
public static YavscGoogleOptions YavscGoogleAppOptions { get ; private set ; }
public static MonoDataProtectionProvider ProtectionProvider { get ; private set ; }
public static MonoDataProtectionProvider ProtectionProvider { get ; private set ; }
@ -38,23 +43,7 @@ namespace Yavsc
services . Add ( ServiceDescriptor . Singleton ( typeof ( IOptions < OAuth2AppSettings > ) , typeof ( OptionsManager < OAuth2AppSettings > ) ) ) ;
services . Add ( ServiceDescriptor . Singleton ( typeof ( IOptions < OAuth2AppSettings > ) , typeof ( OptionsManager < OAuth2AppSettings > ) ) ) ;
// used by the YavscGoogleOAuth middelware (TODO drop it)
// used by the YavscGoogleOAuth middelware (TODO drop it)
services . AddTransient < Microsoft . Extensions . WebEncoders . UrlEncoder , UrlEncoder > ( ) ;
services . AddTransient < Microsoft . Extensions . WebEncoders . UrlEncoder , UrlEncoder > ( ) ;
/ * Obsolete :
var keyParamsFileInfo =
new FileInfo ( Configuration [ "DataProtection:RSAParamFile" ] ) ;
var keyParams = ( keyParamsFileInfo . Exists ) ?
RSAKeyUtils . GetKeyParameters ( keyParamsFileInfo . Name ) :
RSAKeyUtils . GenerateKeyAndSave ( keyParamsFileInfo . Name ) ;
key = new RsaSecurityKey ( keyParams ) ;
services . Configure < TokenAuthOptions > (
to = >
{
to . Audience = Configuration [ "Site:Audience" ] ;
to . Issuer = Configuration [ "Site:Authority" ] ;
to . SigningCredentials =
new SigningCredentials ( key , SecurityAlgorithms . RsaSha256Signature ) ;
}
) ; * /
services . AddAuthentication ( options = >
services . AddAuthentication ( options = >
{
{
options . SignInScheme = Constants . ExternalAuthenticationSheme ;
options . SignInScheme = Constants . ExternalAuthenticationSheme ;
@ -70,7 +59,7 @@ namespace Yavsc
IdentityAppOptions = option ;
IdentityAppOptions = option ;
option . User . AllowedUserNameCharacters + = " " ;
option . User . AllowedUserNameCharacters + = " " ;
option . User . RequireUniqueEmail = true ;
option . User . RequireUniqueEmail = true ;
// option.Cookies.ApplicationCookieAuthenticationScheme = Constants.ApplicationAuthenticationSheme;
// option.Cookies.ApplicationCookieAuthenticationScheme = Constants.ApplicationAuthenticationSheme;
option . Cookies . ApplicationCookie . LoginPath = "/signin" ;
option . Cookies . ApplicationCookie . LoginPath = "/signin" ;
// option.Cookies.ApplicationCookie.AuthenticationScheme = Constants.ApplicationAuthenticationSheme;
// option.Cookies.ApplicationCookie.AuthenticationScheme = Constants.ApplicationAuthenticationSheme;
/ *
/ *
@ -94,93 +83,119 @@ namespace Yavsc
;
;
}
}
private void ConfigureOAuthApp ( IApplicationBuilder app )
private void ConfigureOAuthApp ( IApplicationBuilder app , SiteSettings settings )
{
{
// External authentication shared cookie:
app . UseIdentity ( ) ;
app . UseCookieAuthentication ( options = >
{
ExternalCookieAppOptions = options ;
options . AuthenticationScheme = Constants . ExternalAuthenticationSheme ;
options . AutomaticAuthenticate = true ;
options . ExpireTimeSpan = TimeSpan . FromMinutes ( 5 ) ;
options . LoginPath = new PathString ( Constants . LoginPath . Substring ( 1 ) ) ;
options . AccessDeniedPath = new PathString ( Constants . AccessDeniedPath . Substring ( 1 ) ) ;
} ) ;
app . UseOAuthAuthorizationServer (
app . UseOAuthAuthorizationServer (
options = >
options = >
{
{
OAuthServerAppOptions = options ;
OAuthServerAppOptions = options ;
options . AuthorizeEndpointPath = new PathString ( Constants . AuthorizePath . Substring ( 1 ) ) ;
options . AuthorizeEndpointPath = new PathString ( Constants . AuthorizePath . Substring ( 1 ) ) ;
options . TokenEndpointPath = new PathString ( Constants . TokenPath . Substring ( 1 ) ) ;
options . TokenEndpointPath = new PathString ( Constants . TokenPath . Substring ( 1 ) ) ;
options . ApplicationCanDisplayErrors = true ;
options . ApplicationCanDisplayErrors = true ;
options . AllowInsecureHttp = true ;
options . AllowInsecureHttp = true ;
options . AuthenticationScheme = OAuthDefaults . AuthenticationType ;
options . AuthenticationScheme = OAuthDefaults . AuthenticationType ;
options . TokenDataProtector = ProtectionProvider . CreateProtector ( "Bearer protection" ) ;
options . Provider = new OAuthAuthorizationServerProvider
{
options . Provider = new OAuthAuthorizationServerProvider
OnValidateClientRedirectUri = ValidateClientRedirectUri ,
{
OnValidateClientAuthentication = ValidateClientAuthentication ,
OnValidateClientRedirectUri = ValidateClientRedirectUri ,
OnGrantResourceOwnerCredentials = GrantResourceOwnerCredentials ,
OnValidateClientAuthentication = ValidateClientAuthentication ,
OnGrantClientCredentials = GrantClientCredetails
OnGrantResourceOwnerCredentials = GrantResourceOwnerCredentials ,
} ;
OnGrantClientCredentials = GrantClientCredetails
} ;
options . AuthorizationCodeProvider = new AuthenticationTokenProvider
{
options . AuthorizationCodeProvider = new AuthenticationTokenProvider
OnCreate = CreateAuthenticationCode ,
{
OnReceive = ReceiveAuthenticationCode ,
OnCreate = CreateAuthenticationCode ,
} ;
OnReceive = ReceiveAuthenticationCode ,
} ;
options . RefreshTokenProvider = new AuthenticationTokenProvider
{
options . RefreshTokenProvider = new AuthenticationTokenProvider
OnCreate = CreateRefreshToken ,
{
OnReceive = ReceiveRefreshToken ,
OnCreate = CreateRefreshToken ,
} ;
OnReceive = ReceiveRefreshToken ,
} ;
options . AutomaticAuthenticate = true ;
options . AutomaticChallenge = true ;
options . AutomaticAuthenticate = true ;
}
options . AutomaticChallenge = true ;
) ;
}
) ;
app . UseWhen ( context = > context . Request . Path . StartsWithSegments ( "/api" ) ,
branch = >
{
branch . UseJwtBearerAuthentication (
options = >
{
options . AuthenticationScheme = JwtBearerDefaults . AuthenticationScheme ;
options . AutomaticAuthenticate = true ;
options . SecurityTokenValidators . Clear ( ) ;
options . SecurityTokenValidators . Add ( new TicketDataFormatTokenValidator (
ProtectionProvider
) ) ;
}
) ;
} ) ;
app . UseWhen ( context = > ! context . Request . Path . StartsWithSegments ( "/api" ) ,
branch = >
{
// External authentication shared cookie:
branch . UseCookieAuthentication ( options = >
{
ExternalCookieAppOptions = options ;
options . AuthenticationScheme = Constants . ExternalAuthenticationSheme ;
options . AutomaticAuthenticate = true ;
options . ExpireTimeSpan = TimeSpan . FromMinutes ( 5 ) ;
options . LoginPath = new PathString ( Constants . LoginPath . Substring ( 1 ) ) ;
// TODO implement an access denied page
options . AccessDeniedPath = new PathString ( Constants . LoginPath . Substring ( 1 ) ) ;
} ) ;
var gvents = new OAuthEvents ( ) ;
YavscGoogleAppOptions = new YavscGoogleOptions
{
ClientId = Configuration [ "Authentication:Google:ClientId" ] ,
ClientSecret = Configuration [ "Authentication:Google:ClientSecret" ] ,
AccessType = "offline" ,
SaveTokensAsClaims = true ,
UserInformationEndpoint = "https://www.googleapis.com/plus/v1/people/me" ,
Events = new OAuthEvents
{
OnCreatingTicket = async context = >
{
using ( var serviceScope = app . ApplicationServices . GetRequiredService < IServiceScopeFactory > ( )
. CreateScope ( ) )
{
var gcontext = context as GoogleOAuthCreatingTicketContext ;
context . Identity . AddClaim ( new Claim ( YavscClaimTypes . GoogleUserId , gcontext . GoogleUserId ) ) ;
var service =
serviceScope . ServiceProvider . GetService < ApplicationDbContext > ( ) ;
await service . StoreTokenAsync ( gcontext . GoogleUserId , context . TokenResponse ) ;
}
}
}
} ;
YavscGoogleAppOptions . Scope . Add ( "https://www.googleapis.com/auth/calendar" ) ;
branch . UseMiddleware < Yavsc . Auth . GoogleMiddleware > ( YavscGoogleAppOptions ) ;
// Facebook
branch . UseFacebookAuthentication ( options = >
{
FacebookAppOptions = options ;
options . AppId = Configuration [ "Authentication:Facebook:AppId" ] ;
options . AppSecret = Configuration [ "Authentication:Facebook:AppSecret" ] ;
options . Scope . Add ( "email" ) ;
options . UserInformationEndpoint = "https://graph.facebook.com/v2.5/me?fields=id,name,email,first_name,last_name" ;
} ) ;
} ) ;
app . UseIdentity ( ) ;
var gvents = new OAuthEvents ( ) ;
YavscGoogleAppOptions = new YavscGoogleOptions
{
ClientId = Configuration [ "Authentication:Google:ClientId" ] ,
ClientSecret = Configuration [ "Authentication:Google:ClientSecret" ] ,
AccessType = "offline" ,
SaveTokensAsClaims = true ,
UserInformationEndpoint = "https://www.googleapis.com/plus/v1/people/me" ,
Events = new OAuthEvents
{
OnCreatingTicket = async context = >
{
using ( var serviceScope = app . ApplicationServices . GetRequiredService < IServiceScopeFactory > ( )
. CreateScope ( ) )
{
var gcontext = context as GoogleOAuthCreatingTicketContext ;
context . Identity . AddClaim ( new Claim ( YavscClaimTypes . GoogleUserId , gcontext . GoogleUserId ) ) ;
var service =
serviceScope . ServiceProvider . GetService < ApplicationDbContext > ( ) ;
await service . StoreTokenAsync ( gcontext . GoogleUserId , context . TokenResponse ) ;
}
}
}
} ;
YavscGoogleAppOptions . Scope . Add ( "https://www.googleapis.com/auth/calendar" ) ;
app . UseMiddleware < Yavsc . Auth . GoogleMiddleware > ( YavscGoogleAppOptions ) ;
// Facebook
app . UseFacebookAuthentication ( options = >
{
FacebookAppOptions = options ;
options . AppId = Configuration [ "Authentication:Facebook:AppId" ] ;
options . AppSecret = Configuration [ "Authentication:Facebook:AppSecret" ] ;
options . Scope . Add ( "email" ) ;
options . UserInformationEndpoint = "https://graph.facebook.com/v2.5/me?fields=id,name,email,first_name,last_name" ;
} ) ;
}
}
}
}