React to identity/options/security changes

This commit is contained in:
Hao Kung 2014-10-08 14:02:04 -07:00
parent f332bf6800
commit 95c7a659c2
5 changed files with 157 additions and 146 deletions

View File

@ -282,7 +282,7 @@ namespace MusicStore.Controllers
{
// Request a redirect to the external login provider
var redirectUrl = Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl });
var properties = Context.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
var properties = SignInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return new ChallengeResult(provider, properties);
}
@ -328,7 +328,7 @@ namespace MusicStore.Controllers
public async Task<ActionResult> ExternalLoginCallback(string returnUrl = null)
{
//https://github.com/aspnet/Identity/issues/216
var loginInfo = await Context.GetExternalLoginInfo();
var loginInfo = await SignInManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
@ -371,7 +371,7 @@ namespace MusicStore.Controllers
{
// Get the information about the user from the external login provider
//https://github.com/aspnet/Identity/issues/216
var info = await Context.GetExternalLoginInfo();
var info = await SignInManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");

View File

@ -294,7 +294,7 @@ namespace MusicStore.Controllers
return View("Error");
}
var userLogins = await UserManager.GetLoginsAsync(user, cancellationToken: Context.RequestAborted);
var otherLogins = Context.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
var otherLogins = SignInManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
return View(new ManageLoginsViewModel
{
@ -311,7 +311,7 @@ namespace MusicStore.Controllers
{
// Request a redirect to the external login provider to link a login for the current user
var redirectUrl = Url.Action("LinkLoginCallback", "Manage");
var properties = Context.ConfigureExternalAuthenticationProperties(provider, redirectUrl, User.Identity.GetUserId());
var properties = SignInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, User.Identity.GetUserId());
return new ChallengeResult(provider, properties);
}
@ -325,7 +325,7 @@ namespace MusicStore.Controllers
return View("Error");
}
//https://github.com/aspnet/Identity/issues/216
var loginInfo = await Context.GetExternalLoginInfo(User.Identity.GetUserId());
var loginInfo = await SignInManager.GetExternalLoginInfoAsync(User.Identity.GetUserId());
if (loginInfo == null)
{
return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });

View File

@ -40,8 +40,6 @@ namespace MusicStore
//Note: ErrorPageOptions.ShowAll to be used only at development time. Not recommended for production.
app.UseErrorPage(ErrorPageOptions.ShowAll);
app.SetDefaultSignInAsAuthenticationType("External");
app.UseServices(services =>
{
//If this type is present - we're on mono
@ -62,23 +60,40 @@ namespace MusicStore
services.AddScoped<MusicStoreContext>();
// Configure DbContext
services.SetupOptions<MusicStoreDbContextOptions>(options =>
{
options.DefaultAdminUserName = configuration.Get("DefaultAdminUsername");
options.DefaultAdminPassword = configuration.Get("DefaultAdminPassword");
if (runningOnMono)
{
options.UseInMemoryStore();
}
else
{
options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
}
});
services.ConfigureOptions<MusicStoreDbContextOptions>(options =>
{
options.DefaultAdminUserName = configuration.Get("DefaultAdminUsername");
options.DefaultAdminPassword = configuration.Get("DefaultAdminPassword");
if (runningOnMono)
{
options.UseInMemoryStore();
}
else
{
options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
}
});
// Add Identity services to the services container
services.AddDefaultIdentity<MusicStoreContext, ApplicationUser, IdentityRole>(configuration);
services.ConfigureFacebookAuthentication(options =>
{
options.AppId = "[AppId]";
options.AppSecret = "[AppSecret]";
options.Notifications = new FacebookAuthenticationNotifications()
{
OnAuthenticated = FacebookNotifications.OnAuthenticated,
OnReturnEndpoint = FacebookNotifications.OnReturnEndpoint,
OnApplyRedirect = FacebookNotifications.OnApplyRedirect
};
options.BackchannelHttpHandler = new FacebookMockBackChannelHttpHandler();
options.StateDataFormat = new CustomStateDataFormat();
options.Scope.Add("email");
options.Scope.Add("read_friendlists");
options.Scope.Add("user_checkins");
});
// Add MVC services to the services container
services.AddMvc();
@ -119,76 +134,56 @@ namespace MusicStore
// Add cookie-based authentication to the request pipeline
app.UseIdentity();
var facebookOptions = new FacebookAuthenticationOptions()
app.UseFacebookAuthentication();
app.UseGoogleAuthentication(options =>
{
AppId = "[AppId]",
AppSecret = "[AppSecret]",
Notifications = new FacebookAuthenticationNotifications()
{
OnAuthenticated = FacebookNotifications.OnAuthenticated,
OnReturnEndpoint = FacebookNotifications.OnReturnEndpoint,
OnApplyRedirect = FacebookNotifications.OnApplyRedirect
},
BackchannelHttpHandler = new FacebookMockBackChannelHttpHandler(),
StateDataFormat = new CustomStateDataFormat()
};
facebookOptions.Scope.Add("email");
facebookOptions.Scope.Add("read_friendlists");
facebookOptions.Scope.Add("user_checkins");
app.UseFacebookAuthentication(facebookOptions);
app.UseGoogleAuthentication(new GoogleAuthenticationOptions()
{
ClientId = "[ClientId]",
ClientSecret = "[ClientSecret]",
AccessType = "offline",
Notifications = new GoogleAuthenticationNotifications()
options.ClientId = "[ClientId]";
options.ClientSecret = "[ClientSecret]";
options.AccessType = "offline";
options.Notifications = new GoogleAuthenticationNotifications()
{
OnAuthenticated = GoogleNotifications.OnAuthenticated,
OnReturnEndpoint = GoogleNotifications.OnReturnEndpoint,
OnApplyRedirect = GoogleNotifications.OnApplyRedirect
},
StateDataFormat = new CustomStateDataFormat(),
BackchannelHttpHandler = new GoogleMockBackChannelHttpHandler()
};
options.StateDataFormat = new CustomStateDataFormat();
options.BackchannelHttpHandler = new GoogleMockBackChannelHttpHandler();
});
app.UseTwitterAuthentication(new TwitterAuthenticationOptions()
app.UseTwitterAuthentication(options =>
{
ConsumerKey = "[ConsumerKey]",
ConsumerSecret = "[ConsumerSecret]",
Notifications = new TwitterAuthenticationNotifications()
options.ConsumerKey = "[ConsumerKey]";
options.ConsumerSecret = "[ConsumerSecret]";
options.Notifications = new TwitterAuthenticationNotifications()
{
OnAuthenticated = TwitterNotifications.OnAuthenticated,
OnReturnEndpoint = TwitterNotifications.OnReturnEndpoint,
OnApplyRedirect = TwitterNotifications.OnApplyRedirect
},
StateDataFormat = new CustomTwitterStateDataFormat(),
BackchannelHttpHandler = new TwitterMockBackChannelHttpHandler(),
};
options.StateDataFormat = new CustomTwitterStateDataFormat();
options.BackchannelHttpHandler = new TwitterMockBackChannelHttpHandler();
#if ASPNET50
BackchannelCertificateValidator = null
options.BackchannelCertificateValidator = null;
#endif
});
var microsoftAccountOptions = new MicrosoftAccountAuthenticationOptions()
app.UseMicrosoftAccountAuthentication(options =>
{
Caption = "MicrosoftAccount - Requires project changes",
ClientId = "[ClientId]",
ClientSecret = "[ClientSecret]",
Notifications = new MicrosoftAccountAuthenticationNotifications()
options.Caption = "MicrosoftAccount - Requires project changes";
options.ClientId = "[ClientId]";
options.ClientSecret = "[ClientSecret]";
options.Notifications = new MicrosoftAccountAuthenticationNotifications()
{
OnAuthenticated = MicrosoftAccountNotifications.OnAuthenticated,
OnReturnEndpoint = MicrosoftAccountNotifications.OnReturnEndpoint,
OnApplyRedirect = MicrosoftAccountNotifications.OnApplyRedirect
},
BackchannelHttpHandler = new MicrosoftAccountMockBackChannelHandler(),
StateDataFormat = new CustomStateDataFormat()
};
microsoftAccountOptions.Scope.Add("wl.basic");
microsoftAccountOptions.Scope.Add("wl.signin");
app.UseMicrosoftAccountAuthentication(microsoftAccountOptions);
};
options.BackchannelHttpHandler = new MicrosoftAccountMockBackChannelHandler();
options.StateDataFormat = new CustomStateDataFormat();
options.Scope.Add("wl.basic");
options.Scope.Add("wl.signin");
});
// Add MVC to the request pipeline
app.UseMvc(routes =>

View File

@ -17,65 +17,98 @@ namespace MusicStore
{
public class Startup
{
public void Configure(IApplicationBuilder app)
public Startup()
{
//Below code demonstrates usage of multiple configuration sources. For instance a setting say 'setting1' is found in both the registered sources,
//then the later source will win. By this way a Local config can be overridden by a different setting while deployed remotely.
var configuration = new Configuration()
Configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables(); //All environment variables in the process's context flow in as configuration values.
}
public IConfiguration Configuration { get; private set; }
public void ConfigureServices(IServiceCollection services)
{
//If this type is present - we're on mono
var runningOnMono = Type.GetType("Mono.Runtime") != null;
// Add EF services to the services container
if (runningOnMono)
{
services.AddEntityFramework()
.AddInMemoryStore();
}
else
{
services.AddEntityFramework()
.AddSqlServer();
}
services.AddScoped<MusicStoreContext>();
// Configure DbContext
services.ConfigureOptions<MusicStoreDbContextOptions>(options =>
{
options.DefaultAdminUserName = Configuration.Get("DefaultAdminUsername");
options.DefaultAdminPassword = Configuration.Get("DefaultAdminPassword");
if (runningOnMono)
{
options.UseInMemoryStore();
}
else
{
options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString"));
}
});
// Add Identity services to the services container
services.AddDefaultIdentity<MusicStoreContext, ApplicationUser, IdentityRole>(Configuration);
services.ConfigureFacebookAuthentication(options =>
{
options.AppId = "550624398330273";
options.AppSecret = "10e56a291d6b618da61b1e0dae3a8954";
});
services.ConfigureGoogleAuthentication(options =>
{
options.ClientId = "977382855444.apps.googleusercontent.com";
options.ClientSecret = "NafT482F70Vjj_9q1PU4B0pN";
});
services.ConfigureTwitterAuthentication(options =>
{
options.ConsumerKey = "9J3j3pSwgbWkgPFH7nAf0Spam";
options.ConsumerSecret = "jUBYkQuBFyqp7G3CUB9SW3AfflFr9z3oQBiNvumYy87Al0W4h8";
});
services.ConfigureMicrosoftAccountAuthentication(options =>
{
options.Caption = "MicrosoftAccount - Requires project changes";
options.ClientId = "000000004012C08A";
options.ClientSecret = "GaMQ2hCnqAC6EcDLnXsAeBVIJOLmeutL";
});
// Add MVC services to the services container
services.AddMvc();
//Add all SignalR related services to IoC.
services.AddSignalR();
//Add InMemoryCache
//Currently not able to AddSingleTon
services.AddInstance<IMemoryCache>(new MemoryCache());
}
public void Configure(IApplicationBuilder app)
{
//Error page middleware displays a nice formatted HTML page for any unhandled exceptions in the request pipeline.
//Note: ErrorPageOptions.ShowAll to be used only at development time. Not recommended for production.
app.UseErrorPage(ErrorPageOptions.ShowAll);
app.UseServices(services =>
{
//If this type is present - we're on mono
var runningOnMono = Type.GetType("Mono.Runtime") != null;
// Add EF services to the services container
if (runningOnMono)
{
services.AddEntityFramework()
.AddInMemoryStore();
}
else
{
services.AddEntityFramework()
.AddSqlServer();
}
services.AddScoped<MusicStoreContext>();
// Configure DbContext
services.SetupOptions<MusicStoreDbContextOptions>(options =>
{
options.DefaultAdminUserName = configuration.Get("DefaultAdminUsername");
options.DefaultAdminPassword = configuration.Get("DefaultAdminPassword");
if (runningOnMono)
{
options.UseInMemoryStore();
}
else
{
options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
}
});
// Add Identity services to the services container
services.AddDefaultIdentity<MusicStoreContext, ApplicationUser, IdentityRole>(configuration);
// Add MVC services to the services container
services.AddMvc();
//Add all SignalR related services to IoC.
services.AddSignalR();
//Add InMemoryCache
//Currently not able to AddSingleTon
services.AddInstance<IMemoryCache>(new MemoryCache());
});
// Add services from ConfigureServices
app.UseServices();
//Configure SignalR
app.UseSignalR();
@ -86,23 +119,11 @@ namespace MusicStore
// Add cookie-based authentication to the request pipeline
app.UseIdentity();
app.UseFacebookAuthentication(new FacebookAuthenticationOptions()
{
AppId = "550624398330273",
AppSecret = "10e56a291d6b618da61b1e0dae3a8954",
});
app.UseFacebookAuthentication();
app.UseGoogleAuthentication(new GoogleAuthenticationOptions()
{
ClientId = "977382855444.apps.googleusercontent.com",
ClientSecret = "NafT482F70Vjj_9q1PU4B0pN",
});
app.UseGoogleAuthentication();
app.UseTwitterAuthentication(new TwitterAuthenticationOptions()
{
ConsumerKey = "9J3j3pSwgbWkgPFH7nAf0Spam",
ConsumerSecret = "jUBYkQuBFyqp7G3CUB9SW3AfflFr9z3oQBiNvumYy87Al0W4h8",
});
app.UseTwitterAuthentication();
//The MicrosoftAccount service has restrictions that prevent the use of http://localhost:5001/ for test applications.
//As such, here is how to change this sample to uses http://ktesting.com:5001/ instead.
@ -119,12 +140,7 @@ namespace MusicStore
//The sample app can then be run via:
// k web
app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions()
{
Caption = "MicrosoftAccount - Requires project changes",
ClientId = "000000004012C08A",
ClientSecret = "GaMQ2hCnqAC6EcDLnXsAeBVIJOLmeutL",
});
app.UseMicrosoftAccountAuthentication();
// Add MVC to the request pipeline
app.UseMvc(routes =>

View File

@ -75,12 +75,12 @@ namespace MusicStore
services.AddScoped<MusicStoreContext>();
// Configure DbContext
services.SetupOptions<MusicStoreDbContextOptions>(options =>
{
options.DefaultAdminUserName = configuration.Get("DefaultAdminUsername");
options.DefaultAdminPassword = configuration.Get("DefaultAdminPassword");
options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
});
services.ConfigureOptions<MusicStoreDbContextOptions>(options =>
{
options.DefaultAdminUserName = configuration.Get("DefaultAdminUsername");
options.DefaultAdminPassword = configuration.Get("DefaultAdminPassword");
options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
});
// Add Identity services to the services container
services.AddDefaultIdentity<MusicStoreContext, ApplicationUser, IdentityRole>(configuration);