سلام و عرض ارادت ممنونم بابت دوره خوبتون
من توی برنامه هام می خوام مدت زمان ClaimsPrincipal رو که به طور پیش فرض 5 دقیقه هست تغییر بدم
ممنون میشم راهنمایی بفرمایید
سلام عزیز.
متوجه نشدم، چه تایمی 5 دقیقه هستش؟
پروژه رو پابلیش کردید و بعد از 5 دقیقه لاگ اوت میشید؟
بله دقیقا - پروژه پابلیش شده بعد از 5 دقیقه لاگ اوت می شم
اگر فکر می کنید نیاز هست که فایل startup رو بفرستم بفرمایید که کد ها مو ارسال کنم
ممنونم
احتمالا data protection تنظیم نیستش. لینک زیر رو ببینید :
https://toplearn.com/ShowQuestion/46298/%D8%AE%D8%A7%D8%B1%D8%AC-%D8%B4%D8%AF%D9%86-%D8%A7%D8%B2-%D9%84%D8%A7%DA%AF%DB%8C%D9%86
using MacroService;
using MacroService.Classes;
using MacroService.Repository;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Localization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using ModelLibrary.Context;
using ModelLibrary.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using ModelLibrary.DataPage.Context;
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.DataProtection;
using System.IO;
namespace Ajanc
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void ConfigureServices(IServiceCollection services)
{
// تنظیم کردیم که کلید ها توی دیتابیس ذخیره بشوند
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(AppContext.BaseDirectory))
.SetDefaultKeyLifetime(new TimeSpan(90, 0, 0, 0, 0))
.SetApplicationName("Ajanc")
.ProtectKeysWithDpapi();
// تنظیم کردیم که کلید ها با
// X509 certificate
// رمزنگاری بشوند
services.AddScoped<IApiHaris, ApiHaris>();
services.AddScoped<IMenu, Menu>();
services.AddScoped<IReserve, Reserve>();
services.AddScoped<IRoles, Roles>();
services.AddScoped<IUsers, Users>();
services.AddScoped<IProtocolCancel, ProtocolCancel>();
services.AddScoped<IHotel, Hotel>();
services.AddScoped<IProtocolSales, ProtocolSales>();
services.AddScoped<IContract, Contract>();
services.AddScoped<ICapacity, Capacity>();
services.AddScoped<IDefualtR, DefualtR>();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddDistributedMemoryCache();
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
//services.AddSession(options =>
//{
// options.IdleTimeout = TimeSpan.FromMinutes(30);
// options.Cookie.HttpOnly = true;
// options.Cookie.IsEssential = true;
//});
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvc();
services.AddRazorPages();
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(600);
})
.AddEntityFrameworkStores<ShahrsaatContext>()
.AddDefaultTokenProviders();
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(600);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/Login";
options.SlidingExpiration = true;
});
services.AddAuthorization(options =>
{
options.AddPolicy("User", policy =>
{
policy.AuthenticationSchemes.Add(CookieAuthenticationDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.RequireRole("User");
});
});
services.AddCors(o => o.AddPolicy("CORSPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
}));
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseStatusCodePages(async context =>
{
if (context.HttpContext.Response.StatusCode == 400)
{
//context.HttpContext.Response.Redirect("/Identity/Account/AccessDenied");
}
else if (context.HttpContext.Response.StatusCode == 404)
{
context.HttpContext.Response.Redirect("/Identity/Account/Login");
}
});
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
//app.UseHttpsRedirection();
app.UseCookiePolicy();
//app.UseHttpsRedirection();
var supportedCultures = new[]
{
new CultureInfo("fa"),
};
supportedCultures[0].NumberFormat.NumberDecimalSeparator = ".";
System.Threading.Thread.CurrentThread.CurrentUICulture = supportedCultures[0];
System.Threading.Thread.CurrentThread.CurrentCulture = supportedCultures[0];
//string deflan = "fa";// _httpContextAccessor.HttpContext.Request.Cookies["key"];
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("fa"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
//app.UseCors("CorsPolicy");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=UserLogin}/{id?}");
endpoints.MapRazorPages();
});
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using ModelLibrary.Models;
using ModelLibrary.Context;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.EntityFrameworkCore;
namespace VHotel.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LoginModel : PageModel
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly MyDbContext _context;
private readonly RoleManager<IdentityRole> _roleManager;
public LoginModel(SignInManager<ApplicationUser> signInManager,
MyDbContext Context,
UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
{
_userManager = userManager;
_signInManager = signInManager;
_context = Context;
_roleManager = roleManager;
}
[BindProperty]
public InputModel Input { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }
public string ReturnUrl { get; set; }
[TempData]
public string ErrorMessage { get; set; }
public class InputModel
{
[Required]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
public async Task OnGetAsync(string returnUrl = null)
{
if (!string.IsNullOrEmpty(ErrorMessage))
{
ModelState.AddModelError(string.Empty, ErrorMessage);
}
returnUrl = returnUrl ?? Url.Content("~/");
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
//ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
ReturnUrl = returnUrl;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(Input.Email);
if (user == null)
{
ModelState.AddModelError(string.Empty, "کاربر یافت نشد");
return Page();
}
var result = await _signInManager.PasswordSignInAsync(user, Input.Password,
Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
IdentityRole newrole = new IdentityRole("User");
var g = await _roleManager.CreateAsync(newrole);
var roleadd = await _userManager.AddToRoleAsync(user, "User");
var role = await _userManager.GetRolesAsync(user);
if (role.Count == 0 || (!role.Contains("User")))
{
ModelState.AddModelError(string.Empty, "شما دسترسی به پنل آژانس رو ندارید");
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
return Page();
}
ClaimsIdentity identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.NameIdentifier, user.UserName),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.Sid, user.Id),
new Claim(ClaimTypes.Role, role.FirstOrDefault())}, CookieAuthenticationDefaults.AuthenticationScheme);
//identity.AddClaim(new Claim("hotelid", user.Hotelid.ToString()));
var principal = new ClaimsPrincipal(identity);
//var login = HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
var login = HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(principal),
new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTime.UtcNow.AddMinutes(600)
});
List<Claim> li = new List<Claim>()
{
new Claim("hotelid", user.Hotelid.ToString()),
new Claim("name", user.Firstname + " " + user.Lastname),
new Claim("logo", user.Addpic),
};
Claim c = new Claim("hotelid", user.Hotelid.ToString());
var claimc = await _userManager.GetClaimsAsync(user);
foreach (var item in claimc)
{
if (item.Type == "hotelid" || item.Type == "name" || item.Type == "logo")
{
await _userManager.RemoveClaimAsync(user,
item);
}
}
foreach (var item in li)
{
await _userManager.AddClaimAsync(user,
item);
}
await _signInManager.SignInAsync(user, isPersistent: true);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(string.Empty, "کلمه عبور اشتباه می باشد");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
}
}
private async Task<string> AuthenticateUser()
{
if (_signInManager.IsSignedIn(User))
{
var f = await _userManager.GetUserAsync(User);
اگر نال باشد بر می گرده به صفحه لاگین
if (f == null)
return "";
return f.Id;
}
اگر نال باشد بر می گرده به صفحه لاگین
return "";
}
public async Task<IActionResult> Index()
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture("fa")),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
string appid = await AuthenticateUser();
if (string.IsNullOrEmpty(appid))
return RedirectToPage("/Account/Login", new { area = "Identity" });
return View();
}
جناب مهندس خیلی ممنونم از پاسخ های سریع که میدید
حقیقتش اولین کد مربوط به startup هست
دومین کد مربوط به لاگین
و سومین مربوط به HomeController هست که وقتی User خالی می شه صفحه ریدارکت می شه به لاگین
من لینک شما رو دیدم و اضافی هم کردم و یک فایل ساخت ولی باز هم بعد از 5 دقیقه لاگ اوت شد
کد زیر محتویات فایل مربوط به ADDDataProtection هست
<?xml version="1.0" encoding="utf-8"?>
<key id="79b16369-2878-4cca-86a1-b24f9c2502a7" version="1">
<creationDate>2021-07-08T16:59:42.7460716Z</creationDate>
<activationDate>2021-07-08T16:59:42.6402953Z</activationDate>
<expirationDate>2021-10-06T16:59:42.6402953Z</expirationDate>
<descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=3.1.16.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
<descriptor>
<encryption algorithm="AES_256_CBC" />
<validation algorithm="HMACSHA256" />
<encryptedSecret decryptorType="Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=3.1.16.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" xmlns="http://schemas.asp.net/2015/03/dataProtection">
<encryptedKey xmlns="">
<!-- This key is encrypted with Windows DPAPI. -->
<value>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA4y7KP9dw2Uq3hS5igaBlDQAAAAACAAAAAAAQZgAAAAEAACAAAAAueDhtGelgewEDmKfiwgjRWCw+d0dC7Jy1QjjaSGqD5QAAAAAOgAAAAAIAACAAAABiQ3MGXZzbTE/WZSDBeWcX7HoFaM1ux+Gq/VAqbo15hFABAAC44A/qxLgvYv2JAE4zmGNI0TnwsqEgYkKQyW180SxZhKKur8BzjZfUqJ0YvRh/Q9ZB5RIXIsmYIRz8ZWM/5w+Rz0DMDCkpc9REC5gT7iAAJDiyQzdNGJ3ijGnGIQ/McXMO1H8y0OUddFEuNKugUQ97UgwDrIY5CAKjE4wjgoFMVDlQhqa0lLVwWBXcOtd/i7G5BY8q+L/6To0mbthUdotfRApLSF22So/J+uh51AhayspVC5xgfIHI84UOTQC0hmhWFGAWFlLReZ04JHLHDdBZAEzsL+FBlCIaeufU9z8qg7MV6O1MQzKCSqtusP/bJ06E74XahxdIR3DwfDjGoi9Dvf1qJPNXOGe0p2aBHSdEJq4P2D1OMfl5XXMu7a4xehqTBmTgHpVnxP7EEEj+ZnBLibn2X8CD7VEm6zJ7EuhlF2C+2NeBWxasF1v2tsEjFQpAAAAAZp8O5jCSiBEjvyqyvUW7FPtoTw78RwLsum0dozBgO2l1nEGdVCkpabTMODp11deKv/QamBSu0rem+9cRubXvKw==</value>
</encryptedKey>
</encryptedSecret>
</descriptor>
</descriptor>
</key>
کداتون که نباید مشکل داشته باشه ولی :
مطمئن شوید که فایلی که ADDDataProtection ایجاد کرده رو حذف کنید که دوباره ایجاد بشه. این فایل رو نباید به اشتراک بزارید.
اول اون ProtectKeyWithDpapi رو بردارید و بررسی کنید ایا مشکل برطرف میشه؟
اگر نشد یه پروژه جدید با حداقل امکانات صرفا برای لاگین ایجاد کنید و پابلیش کنید و بررسی کنید که ایا باز هم این مشکل هست؟
و در تمامی این مراحل هم اون فایل ایجاد شده رو هم حذف کنید که یه تستی بشه.
جناب مهندس ارادتمند هستم
خیلی ممنونم درست شد فایل رو حذف کردم سایت رو رفرش کردم درست شد
این سایت روی هاست و سرور نیست
روی IIS سیستم خودم اوردم بالا و لوکال هاست کار می کنم به خاطر همین به اشتراک گذاشتم
من دو سال دنبال این الگوریتم می گشتم ولی چون به نتیجه نمی رسیدم از روش های دیگه استفاده می کردم
من کلیپ های شما رو هم دیدم واقعا کاملا حرفه ای توضیح داده بودید
ممنونم
خواهش میکنم عزیز، خوشحالم جلسات براتون مفید واقع شده.
دقیقا، به نظر منم داکیومنت ها و ویدو های موردی با این میزان مهم بودن واقعا کمه، حتی خود مایکروسافت هم میتونه یکم مقالات بیشتری در این مورد بزاره.
موفق باشید.