در اینجا توضیح دادم:
https://www.dntips.ir/2008/12/blogger.html
D:\vs-code-examples\sample01>code .
<a data-ajax="true" data-ajax-begin="onBegin"
<script type=text/javascript> function onBegin(xhr, settings) { var token = $('input[name=__RequestVerificationToken]').val(); settings.data = settings.data + '&__RequestVerificationToken=' + token; } </script>
@model MvcApplication1.Models.Com <script> var onSuccess = function (result) { $.validator.unobtrusive.parse("#result"); }; </script> <div id="result" > @using (Ajax.BeginForm( "SendCommentAction", "Home", null, new AjaxOptions { OnSuccess = "onSuccess", UpdateTargetId = "result" }, null) ) { @Html.TextBoxFor(x=>x.Contect) <br/> @Html.ValidationMessageFor(x=>x.Contect) <br/> @Html.ValidationSummary() <input type="submit" value="Save" /> } </div>
public class Idea { public static List<Idea> Ideas = new List<Idea> { new Idea{Content="سایتی که در ایده به اشتراک گذاشته شود",Title = "سایت ایده ها"}, new Idea{Content="عینک گوگل را فارسی کنم",Title = "عینک گوگل"}, }; public string Content { get; set;} public string Title { get; set; } }
[TestFixture] public class IdeaTest { [Test] public void ShouldDisplayListOfIdea() { var viewResult = new IdeaController().Index() as ViewResult; Assert.AreEqual(Idea.Ideas, viewResult.Model) Assert.IsNotNull(viewResult.Model); } }
public class IdeaController : Controller { public ActionResult Index() { return View(Idea.Ideas); } }
[Test] public void ShouldLoadCreateIdeaView() { var viewResult = new IdeaController().Create() as ViewResult; Assert.AreEqual(string.Empty, viewResult.ViewName); }
public ActionResult Create() { return View(); }
[Test] public void ShouldAddIdeaItem() { var idea = new Idea { Title = "شبکه اجتماعی ", Content = " شبکه اجتماعی سینمایی" }; var redirectToRouteResult = new IdeaController().Create(idea) as RedirectToRouteResult; Assert.Contains(idea, Idea.Ideas); Assert.AreEqual("Index",redirectToRouteResult.RouteValues["action"]); }
public ActionResult Create(Idea idea) { Idea.Ideas.Add(idea); return RedirectToAction("Index"); }
"Missing method System.Web.Security.FormsAuthentication::get_IsEnabled() in assembly System.Web.dll
Compiler Error Message: CS1703: An assembly with the same identity `mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' has already been imported. Consider removing one of the references
git clone git://github.com/mono/xsp.git cd xsp ./autogen.sh --prefix=/opt make sudo make install
System.IO.FileNotFoundException: Could not load file or assembly XSP, Version=3.0.0.0
cd xsp/src/Mono.WebServer.XSP/bin/Debug sudo gacutil -i Mono.WebServer.XSP.exe sudo gacutil -i Mono.WebServer.dll
cd myMvcAppPath sudo mono Mono.WebServer.XSP.exe
CS0234: The type or namespace name `Helpers' does not exist in the namespace `System.Web'. Are you missing an assembly reference?
<system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation>
$ gacutil -l Microsoft.Web.Infrastructure The following assemblies are installed into the GAC: Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Number of items = 1
cd /opt/lib/mono/gac # assuming this is your main gac sudo find . */*/*.dll -exec gacutil -i '{}' \;
سپس با کلیک بروی قسمت مشخص شده از تصویر بالا تصویر مانند زیر ظاهر شود.
در این نوشته قصد داریم کادری به این صورت حالا به هر منظوری طراحی نماییم.
برای کار سه قسمت کد داریم:
در مرحله اول ابتدا صفحه وب خود را به نحو زیر ایجاد مینماییم.
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>کادر لغزان با jQuery</title> <script src="Scripts/jquery-1.7.1.min.js"></script> <link href="CSS/site.css" rel="stylesheet" /> </head> <body> <div id="loginPanel"> <div style="height: auto;" id="login"> <div> <div> <br /> محتویات دلخواه خود را در این قسمت قرار دهید </div> </div> <div><a href="#" id="closeLogin"></a></div> </div> <div id="container"> <div id="top"> <!-- login --> <ul> <li> </li> <li><a id="toggleLogin" href="#">پانل باز شو</a></li> </ul> <!-- / login --> </div> <!-- / top --> </div> </div> <div id="main"> محتویات سایت در این قسمت قرار میگیرد </div> </body> </html>
body { margin:0; padding:0; width:100%; background: #e9e9e9 url(images/header_bg.gif) top repeat-x; direction: rtl; } html { padding:0; margin:0; } #main {margin-top: 100px;} #loginPanel { margin: 0px; position: absolute; overflow: hidden; height: auto; z-index: 3000; width: 100%; top: 0px; color: #fff; } #top { background: url(images/login_top.jpg) repeat-x 0 0; height: 38px; position: relative; } #top ul.login { display: block; position: relative; float: right; clear: right; height: 38px; width: auto; margin: 0; right: 150px; color: white; text-align: center; background: url(images/login_r.png) no-repeat right 0; padding-right: 45px; } #top ul.login li.left { background: url(images/login_l.png) no-repeat left 0; height: 38px; width: 45px; padding: 0; margin: 0; display: block; float: left; } #top ul.login li { text-align: left; padding: 0 6px; display: block; float: left; height: 38px; background: url(images/login_m.jpg) repeat-x 0 0; } #top ul.login li a { color: #fff; text-decoration: none; } #top ul.login li a:hover { color: #ff0000; text-decoration: none; } #login { width: 100%; color: white; background: #1E1E1E; overflow: hidden; position: relative; z-index: 3; height: 0px; } #login a { text-decoration: none; color: #fff; } #login a:hover { color: white; text-decoration: none; } #login .loginContent { width: 900px; height: 80px; margin: 0 auto; padding-top: 25px; text-align: right; } #login .loginClose { display: block; position: absolute; right: 15px; top: 10px; width: 70px; text-align: left; } #login .loginClose a { display: block; width: 100%; height: 20px; background: url(images/button_close.jpg) no-repeat right 0; padding-right: 10px; border: none; color: white; } #login .loginClose a:hover { background: url(images/button_close.jpg) no-repeat right -20px; } .cen { text-align: center;} .w_100p{ width: 100%;}
<script type="text/javascript"> $(document).ready(function () { $("#login").hide(0); $("#toggleLogin").click(function () { $("#login").slideToggle("slow"); }); $("#closeLogin").click(function () { $("#login").slideUp("slow"); }); }); </script>
کدهای این قسمت بهروزرسانی شده و از این ریپازیتوری قابل دسترسی است.
docker run --name eventstore-node -d -p 2113:2113 -p 1113:1113 eventstore/eventstore
Install-Package EventStore.Client
public class EventStoreDbContext : IEventStoreDbContext { public async Task<IEventStoreConnection> GetConnection() { IEventStoreConnection connection = EventStoreConnection.Create( new IPEndPoint(IPAddress.Loopback, 1113), nameof(MediatrTutorial)); await connection.ConnectAsync(); return connection; } public async Task AppendToStreamAsync(params EventData[] events) { const string appName = nameof(MediatrTutorial); IEventStoreConnection connection = await GetConnection(); await connection.AppendToStreamAsync(appName, ExpectedVersion.Any, events); } }
services.AddSingleton<IEventStoreDbContext, EventStoreDbContext>();
public class EventLoggerBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> { readonly IEventStoreDbContext _eventStoreDbContext; public EventLoggerBehavior(IEventStoreDbContext eventStoreDbContext) { _eventStoreDbContext = eventStoreDbContext; } public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next) { TResponse response = await next(); string requestName = request.ToString(); // Commands convention if (requestName.EndsWith("Command")) { Type requestType = request.GetType(); string commandName = requestType.Name; var data = new Dictionary<string, object> { { "request", request }, { "response", response } }; string jsonData = JsonConvert.SerializeObject(data); byte[] dataBytes = Encoding.UTF8.GetBytes(jsonData); EventData eventData = new EventData(eventId: Guid.NewGuid(), type: commandName, isJson: true, data: dataBytes, metadata: null); await _eventStoreDbContext.AppendToStreamAsync(eventData); } return response; } }
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EventLoggerBehavior<,>));
با اینکه توصیه نامه W3C از پایان کار پیاده سازی این قابلیت خبر میدهد ولی در حال حاضر که این مقاله تدوین شده است هنوز نهایی اعلام نشده است. برای پشتیبانی مرورگرهای قدیمی از webstorage میتوان از فایل جاوااسکریپتی Store.js کمک گرفت.
مفاهیم امنیتی و محافظت از داده ها
محدودیتهای حمایتی و حفاظتی webstorage دقیقا همانند کوکی هاست. به این معنی که وب سایتهای دیگر توانایی اتصال به webstorage سایت دیگری را ندارند. البته این مورد ممکن است برای وب سایت هایی که بر ساب دومین تکیه کردهاند ایجاد مشکل کند. برای حل این مسائل میتوانید از کتابخانههای سورس بازی چون Cross Storage که توسط Zendesk ارائه شده است، استفاده کرد.
همانند هر مکانیزم ذخیره سازی سمت کلاینت، مواردی توصیه میگردد که رعایت آنها از لحاظ امنیتی پر اهمیت است. به عنوان نمونه ذخیرهی اطلاعات شخصی و موارد حساس توصیه نمیگردد؛ چرا که احتمال دسترسی آسان نفوذگران به دادههای محلی و خواندن آنها وجود دارد.
Data Integrity یا یکپارچگی دادهها نیز در نظر گرفته شده است. باید حفاظتی در برابر عدم موفقیت ذخیره سازی دادهها نیز وجود داشته باشد. این عدم موفقیتها میتواند به دلایل زیر رخ دهد:
IndexedDB
یکی از فرایندهای ذخیره سازی دادهها که همان مزایای webstorage را ارائه میدهد indexed Database API است. این قابلیت از HTML 5 اضافه شده است و قسمتی از مشخصات webstorage شناخته نمیشود. برای همین مستنداتی در حوزهی webstorage برای آن پیدا نخواهید کرد ولی قابلیتهایی فراتر از webstorage دارد.
این قابلیت پیچیدگی بیشتری را نسبت به خود webstorage ایجاد میکند، ولی فرصتهای بسیاری را برای ذخیره سازی دادههایی با معماریهای پیچیدهتر و رابطهها را میدهد. با استفاده از IndexedDB دادهها به شکل دیتابیسهای سمت سرور RDMS ذخیره میشوند و این قابلیت را دارید که به سمت آن کوئری هایی مشابه بانکهای اطلاعاتی سمت سرور را ارسال کنید.
در قسمت آتی نحوه کدنویسی آن را فرا خواهیم گرفت.
[HttpGet] public async Task<IActionResult> Challenge(string provider, string returnUrl) [HttpGet] public async Task<IActionResult> Callback()
namespace DNT.IDP { public class Startup { public void ConfigureServices(IServiceCollection services) { services.Configure<IISOptions>(iis => { iis.AuthenticationDisplayName = "Windows Account"; iis.AutomaticAuthentication = false; });
public ExternalController( IIdentityServerInteractionService interaction, IClientStore clientStore, IEventService events, TestUserStore users = null) { _users = users ?? new TestUserStore(TestUsers.Users); _interaction = interaction; _clientStore = clientStore; _events = events; }
private readonly IUsersService _usersService; public ExternalController( // ... IUsersService usersService) { // ... _usersService = usersService; }
var user = _users.FindByExternalProvider(provider, providerUserId);
var user = await _usersService.GetUserByProviderAsync(provider, providerUserId);
private async Task<(User user, string provider, string providerUserId, IEnumerable<Claim> claims)> FindUserFromExternalProvider(AuthenticateResult result)
private TestUser AutoProvisionUser(string provider, string providerUserId, IEnumerable<Claim> claims) { var user = _users.AutoProvisionUser(provider, providerUserId, claims.ToList()); return user; }
[HttpGet] public IActionResult RegisterUser(string returnUrl)
namespace DNT.IDP.Controllers.UserRegistration { public class RegistrationInputModel { public string ReturnUrl { get; set; } public string Provider { get; set; } public string ProviderUserId { get; set; } public bool IsProvisioningFromExternal => !string.IsNullOrWhiteSpace(Provider); } }
namespace DNT.IDP.Controllers.Account { [SecurityHeaders] [AllowAnonymous] public class ExternalController : Controller { public async Task<IActionResult> Callback() { var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme); var returnUrl = result.Properties.Items["returnUrl"] ?? "~/"; var (user, provider, providerUserId, claims) = await FindUserFromExternalProvider(result); if (user == null) { // user = AutoProvisionUser(provider, providerUserId, claims); var returnUrlAfterRegistration = Url.Action("Callback", new { returnUrl = returnUrl }); var continueWithUrl = Url.Action("RegisterUser", "UserRegistration" , new { returnUrl = returnUrlAfterRegistration, provider = provider, providerUserId = providerUserId }); return Redirect(continueWithUrl); }
namespace DNT.IDP.Controllers.UserRegistration { public class UserRegistrationController : Controller { [HttpGet] public IActionResult RegisterUser(RegistrationInputModel registrationInputModel) { var vm = new RegisterUserViewModel { ReturnUrl = registrationInputModel.ReturnUrl, Provider = registrationInputModel.Provider, ProviderUserId = registrationInputModel.ProviderUserId }; return View(vm); }
namespace DNT.IDP.Controllers.UserRegistration { public class RegisterUserViewModel : RegistrationInputModel {
<inputtype="hidden"asp-for="ReturnUrl"/> <inputtype="hidden"asp-for="Provider"/> <inputtype="hidden"asp-for="ProviderUserId"/>
@if (!Model.IsProvisioningFromExternal) { <div> <label asp-for="Password"></label> <input type="password" placeholder="Password" asp-for="Password" autocomplete="off"> </div> }
namespace DNT.IDP.Controllers.UserRegistration { public class UserRegistrationController : Controller { [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> RegisterUser(RegisterUserViewModel model) { // ... if (model.IsProvisioningFromExternal) { userToCreate.UserLogins.Add(new UserLogin { LoginProvider = model.Provider, ProviderKey = model.ProviderUserId }); } // add it through the repository await _usersService.AddUserAsync(userToCreate); // ... } }
if (!model.IsProvisioningFromExternal) { // log the user in // issue authentication cookie with subject ID and username var props = new AuthenticationProperties { IsPersistent = false, ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration) }; await HttpContext.SignInAsync(userToCreate.SubjectId, userToCreate.Username, props); }