Design

Design
asp.net mvc

2017年4月8日 星期六

StackExchange.Redis 簡單應用

StackExchange.Redis.Extensions 的使用 以下代碼基於 StackExchange.Redis.Extensions.Newtonsoft(Json.NET)實現對泛型的直接添加和獲取。當然,也可以直接以字符串的形式存儲,自行對內容進行序列化和反序列化。 首先我們先Install
PM> Install-Package StackExchange.Redis.Extensions.Newtonsoft
添加好我們的Web.config https://github.com/imperugo/StackExchange.Redis.Extensions

private RedisHelper()
{
    _client = new StackExchangeRedisCacheClient(new NewtonsoftSerializer());
}
接下來我們就可以根據_client 簡單建立 get set
public T Get(string key)
{
    return _client.Get(key);
}

public bool Set(string key, T data)
{
    return _client.Add(key, data);
}
後續你就可以建立相關 Interface DI後去應用他 非常簡單吧

ASP.NET MVC AJAX AjaxAntiForgeryToken 防範CSRF

維基百科,自由的百科全書

跨站請求偽造英語:Cross-site request forgery),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制用戶在當前已登錄的Web應用程式上執行非本意的操作的攻擊方法。[1] 跟跨網站指令碼(XSS)相比,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。

我們怎麼防止被外部網站攻擊我們的資料,廢話不多 就開始吧


我們先建立我們要在呼叫前的驗證
  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class AjaxValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    {

        public Task ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func> continuation)
        {
         
            if (actionContext == null)
            {
                throw new ArgumentNullException("HttpActionContext");
            }

            if (actionContext.Request.Method != HttpMethod.Get)
            {
             
                return ValidateAntiForgeryToken(actionContext, cancellationToken, continuation);
            }

            return continuation();
        }

        private Task ValidateAntiForgeryToken(HttpActionContext actionContext, CancellationToken cancellationToken, Func> continuation)
        {
            try
            {
                string cookieToken = "";
                string formToken = "";
                IEnumerable tokenHeaders;

       
                if (actionContext.Request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
                {
                    string[] tokens = tokenHeaders.First().Split(':');
                    if (tokens.Length == 2)
                    {
                        cookieToken = tokens[0].Trim();
                        formToken = tokens[1].Trim();
                    }
                }
                AntiForgery.Validate(cookieToken, formToken);
            }
            catch (System.Web.Mvc.HttpAntiForgeryException ex)
            {
                actionContext.Response = new HttpResponseMessage
                {
                    StatusCode = HttpStatusCode.Forbidden,
                    RequestMessage = actionContext.ControllerContext.Request
                };
                return FromResult(actionContext.Response);
            }
            return continuation();
        }
        private Task FromResult(HttpResponseMessage result)
        {
            var source = new TaskCompletionSource();
            source.SetResult(result);
            return source.Task;
        }
    }



加在我們取資料的action上
        [HttpPost]
        [AjaxValidateAntiForgeryToken]
        public async Task GetAccountbyEmail()
        {
            var Email = new GetByMail();
            Email.Email = User.Identity.GetAccountEmail();

            var Request = await _accountService.GetByEmail(Email);

            return Request;
        }

我們再去建立要放在cshtml頁面的HtmlHelper去建立我們的Token
public static MvcHtmlString AjaxAntiForgeryToken(this HtmlHelper helper)
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            TagBuilder builder = new TagBuilder("div");
            string ForgeryToken = string.Concat(cookieToken,":", formToken);
            builder.MergeAttribute("id", "AntiForgery");
            builder.MergeAttribute("Value", ForgeryToken);
            builder.ToString(TagRenderMode.Normal);
            return  MvcHtmlString.Create(builder.ToString());

        }

然後在我們的cshtml頁面使用他 @Html.AjaxAntiForgeryToken()

 接著最重要的就是我們要在前端呼在我們的headers 加上剛剛在cshtml建立的token
this.http.get(url, { headers: { 'RequestVerificationToken': $("#AntiForgery").attr("value") } });

完成我們的驗證步驟 當進入頁面 會產生 token > 接著我們撈取資料時會針對herder上的token 去做驗證 > 接著要做的事情就可以自己處理了

asp.net mvc 常用的ActionFilter

我們開發時常常需要再Action或Action後 進行一下邏輯處理 這時候我們就會用到我們的ActionFilter

在 ActionFilterAttribute 中有提供四個覆蓋方法
 OnActionExecuting – Action 之前執行
OnActionExecuted – Action 之後執行
OnResultExecuting – Action Result 之前執行
OnResultExecuted – Action Result 之後執行

 我們先建一個 class 去繼承 ActionFilterAttribute class 名稱規則就是 名稱+Attribute 例如下面
 public class DosomethingAttribute : ActionFilterAttribute
    {
        /// 
        /// Action 之前執行
        /// 
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //想做啥就做啥
        }
        /// 
        /// Action 之後執行
        /// 
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //想做啥就做啥
        }
        /// 
        /// Action Result 之前執行
        /// 
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            //想做啥就做啥
        }
        /// 
        /// Action Result 之後執行
        /// 
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            //想做啥就做啥
        }
    }

再來例如我想再進入index action 引用 我就可以這樣使用

        [Dosomething]
        public ActionResult Index()
        {
            return View();
        }