I implemented Authorization and Authentication.
- In Areas, when i navigate to a controller with Authorize attribute, it redirects to /Account/Login whereas I want it to be redirected to /AreaName/Account/Login.
- When redirection is triggered to /Account/Login, it automatically triggers Google Authentication and redirects to Signin with Google page.
Below is the implementation to my Program.cs file.
builder.Services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = true;
options.Password.RequireLowercase = false;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.User.RequireUniqueEmail = true;
options.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
builder.Services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Error/AccessDenied";
options.Cookie.Name = "sms_db";
options.Cookie.HttpOnly = false;
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
//options.LoginPath = "/Account/Index";
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
options.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = redirectContext =>
{
// Area's own login page
const string area = "/Admin";
if (redirectContext.Request.Path.StartsWithSegments(area))
{
var uriBuilder = new UriBuilder(redirectContext.RedirectUri);
uriBuilder.Path = area + uriBuilder.Path;
redirectContext.RedirectUri = uriBuilder.ToString();
}
return Task.CompletedTask;
}
};
});
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(options =>
{
IConfigurationSection googleAuthNSection = config.GetSection("Authentication:Google");
options.ClientId = googleAuthNSection["ClientId"] ?? "951287857071-jb9kljdsnckb40cgentmofbghogrb623.apps.googleusercontent.com";
options.ClientSecret = googleAuthNSection["ClientSecret"] ?? "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";
});
Alongwith, default [Authorize] attribute in my controllers.