- میتونید از قالبهای AcroForm مربوط به Open Office در هدر Pdf Report استفاده کنید.
این موارد رو در قسمتهای بعدی توضیح میدم.
Note: This is the source code for ASP.NET Identity 2.2. ASP.NET Identity 3.0 is part of ASP.NET 5 and the source code is on GitHub.
using System.Security.Claims; using Microsoft.AspNetCore.Http; using Microsoft.Net.Http.Headers; using UAParser; namespace ASPNETCore2JwtAuthentication.Services; /// <summary> /// To invalidate an old user's token from a new device /// </summary> public class DeviceDetectionService : IDeviceDetectionService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly ISecurityService _securityService; public DeviceDetectionService(ISecurityService securityService, IHttpContextAccessor httpContextAccessor) { _securityService = securityService ?? throw new ArgumentNullException(nameof(securityService)); _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); } public string GetCurrentRequestDeviceDetails() => GetDeviceDetails(_httpContextAccessor.HttpContext); public string GetDeviceDetails(HttpContext context) { var ua = GetUserAgent(context); if (ua is null) { return "unknown"; } var client = Parser.GetDefault().Parse(ua); var deviceInfo = client.Device.Family; var browserInfo = $"{client.UA.Family}, {client.UA.Major}.{client.UA.Minor}"; var osInfo = $"{client.OS.Family}, {client.OS.Major}.{client.OS.Minor}"; //TODO: Add the user's IP address here, if it's a banking system. return $"{deviceInfo}, {browserInfo}, {osInfo}"; } public string GetDeviceDetailsHash(HttpContext context) => _securityService.GetSha256Hash(GetDeviceDetails(context)); public string GetCurrentRequestDeviceDetailsHash() => GetDeviceDetailsHash(_httpContextAccessor.HttpContext); public string GetCurrentUserTokenDeviceDetailsHash() => GetUserTokenDeviceDetailsHash(_httpContextAccessor.HttpContext?.User.Identity as ClaimsIdentity); public string GetUserTokenDeviceDetailsHash(ClaimsIdentity claimsIdentity) { if (claimsIdentity?.Claims == null || !claimsIdentity.Claims.Any()) { return null; } return claimsIdentity.FindFirst(ClaimTypes.System)?.Value; } public bool HasCurrentUserTokenValidDeviceDetails() => HasUserTokenValidDeviceDetails(_httpContextAccessor.HttpContext?.User.Identity as ClaimsIdentity); public bool HasUserTokenValidDeviceDetails(ClaimsIdentity claimsIdentity) => string.Equals(GetCurrentRequestDeviceDetailsHash(), GetUserTokenDeviceDetailsHash(claimsIdentity), StringComparison.Ordinal); private static string GetUserAgent(HttpContext context) { if (context is null) { return null; } return context.Request.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgent) ? userAgent.ToString() : null; } }
public string GetDeviceDetails(HttpContext context) { var ua = GetUserAgent(context); if (ua is null) { return "unknown"; } var client = Parser.GetDefault().Parse(ua); var deviceInfo = client.Device.Family; var browserInfo = $"{client.UA.Family}, {client.UA.Major}.{client.UA.Minor}"; var osInfo = $"{client.OS.Family}, {client.OS.Major}.{client.OS.Minor}"; //TODO: Add the user's IP address here, if it's a banking system. return $"{deviceInfo}, {browserInfo}, {osInfo}"; }
new(ClaimTypes.System, _deviceDetectionService.GetCurrentRequestDeviceDetailsHash(), ClaimValueTypes.String, _configuration.Value.Issuer),
.AddJwtBearer(cfg => { cfg.Events = new JwtBearerEvents { OnTokenValidated = context => { var tokenValidatorService = context.HttpContext.RequestServices.GetRequiredService<ITokenValidatorService>(); return tokenValidatorService.ValidateAsync(context); }, }; });
.AddCookie(options => { options.Events = new CookieAuthenticationEvents { OnValidatePrincipal = context => { var cookieValidatorService = context.HttpContext.RequestServices.GetRequiredService<ICookieValidatorService>(); return cookieValidatorService.ValidateAsync(context); } }; });
"address":{ "street":"test 59", "city":"City test", "post_number":"25050" },
columns : [ { field: "address.street", title: "Street" }, { field: "address.city", title: "City" }, { field: "address.post_number", title: "Post#" } ]
بر اساس آموزش مدیریت حالت در Blazor، قصد داریم یک سرویس پیام هشدار ساده، ولی زیبا را بوسیله کامپوننت Alert بوت استرپ ۵ ، بدون استفاده از توابع جاوا اسکریپتی، طراحی کنیم.
در ابتدا کتابخانههای css زیر را بوسیله LibMan به پروژه اضافه کرده و مداخل فایلهای را css نیز اضافه میکنیم:
{ "version": "1.0", "defaultProvider": "cdnjs", "libraries": [ { "provider": "unpkg", "library": "bootstrap@5.0.0", "destination": "wwwroot/lib/bootstrap" }, { "provider": "unpkg", "library": "open-iconic@1.1.1", "destination": "wwwroot/lib/open-iconic" }, { "provider": "unpkg", "library": "animate.css@4.1.1", "destination": "wwwroot/lib/animate" }, { "provider": "unpkg", "library": "bootstrap-icons@1.5.0", "destination": "wwwroot/lib/bootstrap-icons/" } ] }
public enum AlertType { Success, Info, Danger, Warning } public class AlertService { public void ShowAlert(string message, AlertType alertType, string animate = "animate__fadeIn") { OnChange?.Invoke(message, alertType,animate); } public event Action<string,AlertType, string> OnChange; }
services.AddScoped<AlertService>();
توضیحات:
در کدهای نهایی برنامه قرار است به این نحو کار نمایش Alertها را در کامپوننتهای مختلف انجام دهیم:
@inject AlertService AlertService @code { private void Success() { AlertService.ShowAlert("Success!", AlertType.Success); }
کدهای کامپوننت Alert.razor
@inject AlertService AlertService @implements IDisposable <style> .alert-show { display: flex; flex-direction: row; } .alert-hide { display: none; } </style> <div style="z-index: 5"> <div " + "alert-show" :"alert-hide")"> <i width="24" height="24"></i> <div> @Message </div> <button type="button" data-bs-dismiss="alert" aria-label="Close" @onclick="CloseClick"></button> </div> </div> @code { AlertType AlertType { get; set; } string Icon { get; set; } string Css { get; set; } string Animation { get; set; } private bool IsVisible { get; set; } private string Message { get; set; } System.Timers.Timer _alertTimeOutTimer; protected override void OnInitialized() { AlertService.OnChange += ShowAlert; } private void ShowAlert(string message, AlertType alertType, string animate) { _alertTimeOutTimer = new System.Timers.Timer { Interval = 5000, Enabled = true, AutoReset = false }; _alertTimeOutTimer.Elapsed += HideAlert; Message = message; switch (alertType) { case AlertType.Success: Css = "bg-success"; Icon = "bi-check-circle"; break; case AlertType.Info: Css = "bg-info"; Icon = "bi-info-circle-fill"; break; case AlertType.Danger: Css = "bg-danger"; Icon = "bi-exclamation-circle"; break; case AlertType.Warning: Css = "bg-warning"; Icon = "bi-exclamation-triangle-fill"; break; default: Css = Css; break; } AlertType = alertType; Animation = animate; IsVisible = true; InvokeAsync(StateHasChanged); } private void HideAlert(Object source, System.Timers.ElapsedEventArgs e) { IsVisible = false; InvokeAsync(StateHasChanged); _alertTimeOutTimer.Close(); } public void Dispose() { if (AlertService != null) AlertService.OnChange -= ShowAlert; if (_alertTimeOutTimer != null) { _alertTimeOutTimer.Elapsed -= HideAlert; _alertTimeOutTimer?.Dispose(); } } private void CloseClick() { IsVisible = false; _alertTimeOutTimer.Close(); InvokeAsync(StateHasChanged); } }
<div> <Alert></Alert>