{"id":399,"date":"2025-01-02T11:47:51","date_gmt":"2025-01-02T04:47:51","guid":{"rendered":"https:\/\/thietkewebdalat.net\/blog\/?p=399"},"modified":"2025-01-02T11:49:50","modified_gmt":"2025-01-02T04:49:50","slug":"huong-dan-cai-dat-ckeditor-4-va-ckfinder-3","status":"publish","type":"post","link":"https:\/\/thietkewebdalat.net\/blog\/huong-dan-cai-dat-ckeditor-4-va-ckfinder-3\/","title":{"rendered":"H\u01b0\u1edbng d\u1eabn c\u00e0i \u0111\u1eb7t ckeditor 4 v\u00e0 ckfinder 3"},"content":{"rendered":"<p>H\u00f4m nay m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1c b\u1ea1n c\u00e0i \u0111\u1eb7t ckeditor v\u00e0 t\u00edch h\u1ee3p ckfinder trong website s\u1eed d\u1ee5ng .Net MVC 5<\/p>\n<p>\u0110\u1ea7u ti\u00ean b\u1ea1n c\u1ea7n t\u1ea3i ckeditor 4 v\u00e0 ckfinder 3, b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp trang ch\u1ee7 \u0111\u1ec3 t\u1ea3i v\u1ec1<\/p>\n<p>Sau \u0111\u00f3 b\u1ea1n c\u1ea7n c\u00e0i hai th\u01b0 vi\u1ec7n n\u00e0y t\u1eeb nuget v\u1ec1 :<\/p>\n<p>Install-Package Microsoft.Owin<br \/>\nInstall-Package Microsoft.Owin.Host.SystemWeb<\/p>\n<p>Sau khi c\u00e0i \u0111\u1eb7t xong b\u1ea1n c\u1ea7n c\u1ea5u h\u00ecnh OWIN Startup: Th\u00eam t\u1ec7p Startup.cs n\u1ebfu ch\u01b0a c\u00f3<\/p>\n<pre>public partial class Startup\r\n{\r\npublic void Configuration(IAppBuilder app)\r\n{\r\nConfigureAuth(app);\r\n\/\/ For more information on how to configure your application, visit https:\/\/go.microsoft.com\/fwlink\/?LinkID=316888\r\nLoggerManager.LoggerAdapterFactory = new NLogLoggerAdapterFactory();\r\nFileSystemFactory.RegisterFileSystem();\r\napp.Map(\"\/ckfinder\/connector\", SetupConnector);\r\n}\r\nprivate static void SetupConnector(IAppBuilder app)\r\n{\r\n\/*\r\n* Create connector instance using ConnectorBuilder. The call to LoadConfig() method\r\n* will configure the connector using CKFinder configuration options defined in Web.config.\r\n*\/\r\nvar connectorFactory = new OwinConnectorFactory();\r\nvar connectorBuilder = new ConnectorBuilder();\r\nvar customAuthenticator = new CustomCKFinderAuthenticator();\r\nvar connector = connectorBuilder\r\n.LoadConfig()\r\n.SetRequestConfiguration(\r\n(request, config) =&gt;\r\n{\r\nconfig.LoadConfig();\r\nvar privateBackend = config.GetBackend(\"CKFinderPrivate\");\r\n\r\n\/*\r\n* Create a key-value store provider to be used for saving CKFinder cache data.\r\n*\/\r\nvar keyValueStoreProvider = new FileSystemKeyValueStoreProvider(privateBackend);\r\n\r\nconfig.SetKeyValueStoreProvider(keyValueStoreProvider);\r\n})\r\n.SetAuthenticator(customAuthenticator)\r\n.Build(connectorFactory);\r\n\r\n\/*\r\n* Add the CKFinder connector middleware to web application pipeline.\r\n*\/\r\napp.UseConnector(connector);\r\n}\r\n}\r\n<\/pre>\n<p>Ti\u1ebfp theo b\u1ea1n c\u1ea7n t\u1ea1o m\u1ed9t th\u01b0 m\u1ee5c : Authenticator\/CustomCKFinderAuthenticator.cs<\/p>\n<p>v\u00e0 vi\u1ebft code nh\u01b0 sau :<\/p>\n<pre>public class CustomCKFinderAuthenticator: IAuthenticator\r\n{\r\n    public Task AuthenticateAsync(ICommandRequest commandRequest, CancellationToken \r\ncancellationToken)\r\n    {\r\n        var claimsPrincipal = commandRequest.Principal as ClaimsPrincipal;\r\n\r\n        var roles = claimsPrincipal?.Claims?.Where(x =&gt; x.Type == ClaimTypes.Role)\r\n.Select(x =&gt; x.Value).ToArray();\r\n\r\n        \/*\r\n         * Enable CKFinder only for authenticated users\r\n         *\/\r\n        var isAuthenticated = claimsPrincipal.Identity.IsAuthenticated;\r\n\r\n        var user = new User(isAuthenticated, roles);\r\n        return Task.FromResult((IUser)user);\r\n    }\r\n}\r\n<\/pre>\n<p>Ti\u1ebfp theo b\u1ea1n c\u1ea5u h\u00ecnh ckfinder trong ckeditor, b\u1ea1n truy c\u1eadp v\u00e0o t\u1eadp tin config.js v\u00e0 th\u00eam \u0111o\u1ea1n sau :<\/p>\n<pre>config.filebrowserBrowseUrl= '\/Assests\/plugins\/ckfinder\/ckfinder.html',\r\nconfig.filebrowserImageBrowseUrl= '\/Assests\/plugins\/ckfinder\/ckfinder.html?type=Images',\r\nconfig.filebrowserFlashBrowseUrl= '\/Assests\/plugins\/ckfinder\/ckfinder.html?type=Flash'\r\n<\/pre>\n<p>Ti\u1ebfp t\u1ee5c b\u1ea1n nh\u1edb nh\u00fang ckfinder.js v\u00e0 ckeditor.js v\u00e0o t\u1eadp tin _layout.cshtml nh\u00e9.<br \/>\nTi\u1ebfp t\u1ee5c \u0111\u1ec3 ki\u1ec3m tra n\u00f3 c\u00f3 ho\u1ea1t \u0111\u1ed9ng kh\u00f4ng.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00f4m nay m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1c b\u1ea1n c\u00e0i \u0111\u1eb7t ckeditor v\u00e0 t\u00edch h\u1ee3p ckfinder trong website s\u1eed d\u1ee5ng .Net MVC 5 \u0110\u1ea7u ti\u00ean b\u1ea1n c\u1ea7n t\u1ea3i ckeditor 4 v\u00e0 ckfinder 3, b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp trang ch\u1ee7 \u0111\u1ec3 t\u1ea3i v\u1ec1 Sau \u0111\u00f3 b\u1ea1n c\u1ea7n c\u00e0i hai th\u01b0 vi\u1ec7n n\u00e0y t\u1eeb nuget v\u1ec1 : [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":400,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[8,10],"tags":[],"class_list":{"0":"post-399","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-net","8":"category-mvc"},"_links":{"self":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/comments?post=399"}],"version-history":[{"count":1,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/399\/revisions"}],"predecessor-version":[{"id":401,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/399\/revisions\/401"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/media\/400"}],"wp:attachment":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/media?parent=399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/categories?post=399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/tags?post=399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}