版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第一種:FORM驗(yàn)證(若在ASP.NET應(yīng)用程序使用,則該驗(yàn)證方式不支持跨域,因?yàn)?定義一個FormAuthenticationFil ttribute,該類繼承自AuthorizationFil 1using2using3using4using5using6using7using8using9usingusingusingusingusingusingnamespace{publicclassFormAuthenticationFilttribute:AuthorizationFil{privateconststringUnauthorizedMessage="請求未,。publicoverridevoid{if>{}if(HttpContext.Current.User!=null&&{}vars=actionContext.Request.Headers.Getif(s==null||s.Count<{actionContext.Response=new{Content=newStringContent(UnauthorizedMessage,Encoding.UTF8)}FormsAuthenticationTicketticket=GetTicket(if(ticket=={actionContext.Response=new{Content=newStringContent(UnauthorizedMessage,Encoding.UTF8)}varprincipal=newGenericPrincipal(newFormsIdentity(ticket),HttpContext.Current.User=Thread.CurrentPrincipal=}privateFormsAuthenticationTicketGetTicket(Collection<HeaderValue>{FormsAuthenticationTicketticket=foreach(varitemin{var=item.s.SingleOrDefault(c=>c.Nameif(!={ticket=FormsAuthentication.Decrypt(}}return}}}在需要認(rèn)證后才能的Controller中類或ACTION方法上添加上述過濾器 1using2using3using4using5using6using7using8using9using10namespace11{12publicclassTestController:{13publicHttpResponseMessageLogin(stringuname,string{if parison.OrdinalIgnoreCase)&&{FormsAuthenticationTicketticket=newFormsAuthenticationTicket(1,uname,DateTime.Now.AddMinutes(30),false,stringauthTicket=9//為Http=newHttp(FormsAuthentication.FormsName,20.Path=FormsAuthentication.FormsPath; 2122//FormsAuthentication.SetAuth(uname,false,23returnRequest.CreateResponse(HttpStatusCode.OK,}24{25ame){Expires=DateTime.Now.AddDays(-10)});//測試用:當(dāng)?shù)卿浭r,清除可能存在的驗(yàn)證26returnRequest.CreateErrorResponse(HttpStatusCode.NotFound,"登錄失敗,無效的用戶名或27}28}29//GETpublicIEnumerable<string>30{returnnewstring[]{"value1","value2"31}3//GET233publicstringGetValue(int{return34}}35}363738394044748495055758若成功調(diào)用Login方法后(),再 來調(diào)用Api的相關(guān)方法,示例代碼如下1publicasyncstaticvoid2{3HttpHandlerhandler=newHttp4handler.Uses=true;//因?yàn)椴捎肍orm驗(yàn)證,所以需要使用記錄登錄信56 =newHttp789varresponse=awaitvarr=await ine("StatusCode:{0}",if{Console.Wriine("Msg:{1}",response.StatusCode,} ine("Msg:{1}",response.StatusCode,vargetshandler.Container.Gets(newUri("Console.Wriine("獲取到的數(shù)量:"+get for(inti=0;i<gets.Count;{Console.Wriine(gets[i].Name+":"}response=varr2=awaitforeach(stringitemin{Console.Wriine("GetValues-ItemValue:{0}",}response=varr3=awaitConsole.Wriine("GetValue-ItemValue:{0}",}如果WebApi作為ASP.NET或MVC的一部份使用,那么完全可以采用基于默認(rèn)的FORM驗(yàn)證特ASP.NETMVC的FORM驗(yàn)證1<authentication2然后在需要認(rèn)證后才能的Controller中類或ACTION方法上添加Authorize特性,Controller與上文相同WEB.CONFIG中配置:12<deny3最后將WEBAPI寄宿到(或者說發(fā)布到)IIS,且需要在IIS中啟用WINDOWS驗(yàn)證,如下圖示這樣就完成了該驗(yàn)證模式(理論上WEB服務(wù)、WCF若都以IIS為宿主,都可以采用集成WINDOWS驗(yàn)證 來調(diào)用WEBAPI,示例代碼如下1publicasyncstaticvoid2{3HttpHandler=new45handler.Options67=newNetworkCredential("admin", 89Http=newHttpvarresponse=varr2=foreach(stringitemin{Console.Wriine("GetValues-Value:{0}",}response=varr3=awaitConsole.Wriine("GetValue-Item}定義一個繼承自AuthorizationFil 1using2using3using4using5using6using7using8using9using10usingusing11namespace12{publicclassHttpBasicAuthenticationFilter:AuthorizationFil{publicoverridevoidOnAuthorization(System.Web.Http.Controllers.HttpActionContext{{}if(Thread.CurrentPrincipal!=null&&8{}stringauthParameter=varauthValue=actionContext.Request.Headers.Authorization;if(authValue!=null&&authValue.Scheme=="Basic"){authParameterauthValue.Parameter;//authparameter:Base64編碼的(碼}425if{2627}28authParameter=29varauthToken=if(authToken.Length<30{3}if(!ValidateUser(authToken[0],{}varprincipal=newGenericPrincipal(newGenericIdentity(authToken[0]),Thread.CurrentPrincipal=if(HttpContext.Current!=3{7HttpContext.Current.User=38}39}40privatevoidChallenge(HttpActionContext4{varhost=actionContext.Response=actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,請求未,。//actionContext.Response.Headers.Add("WWW-Authenticatestring.Format("Basicrealm=\"{0}\"",ing.Format("realm=\"{0}\"",}protectedvirtualboolValidateUser(stringuserName,string474{if(userName.Equals("admin", parison.OrdinalIgnoreCase)&&password.Equals("api.admin"))//判斷用戶名及,實(shí)際可從數(shù)據(jù)庫查詢驗(yàn)證,可重寫{8return4}9return50}5}1}5253545556575859606676869707172737475767778798088788在需要認(rèn)證后才能的Controller中類或ACTION方法上添加上述定義的 來調(diào)用WEBAPI,示例代碼如下1publicasyncstaticvoid2{3 =newHttp4.DefaultRequestHeaders.Authorization=CreateBasicHeader("admin",56varresponse=await7varr2=await8foreach(stringitemin9{Console.Wriine("GetValues-ItemValue:{0}",}response=awaitvarr3=awaitConsole.Wriine("GetValue-ItemValue:{0}",}publicstaticAuthenticationHeaderValueCreateBasicHeader(stringusername,string{returnnewusername,}實(shí)現(xiàn)Basic基礎(chǔ)認(rèn)證,除了通過繼承自AuthorizationFil ttribute來實(shí)現(xiàn)自定義的驗(yàn)證過濾器外,還可以通過繼承自DelegatingHandler來實(shí)現(xiàn)自定義的消息處理管道類,具體的實(shí)現(xiàn)方式可參見園子里的這篇文章: 1using2using3using4using5using6using7using8using9usingusingusingnamespace{publicclassHttpDigestAuthenticationHandler:{protectedasyncoverrideTask<HttpResponseMessage>SendAsync(HttpRequestMessageCancellationToken{{HttpRequestHeadersheaders=if(headers.Authorization!={Headerheader=newif(Nonce.IsValid(header.Nonce,{stringpassword if {password"api.admin";//}#region計(jì)算正確的可的Hashstringha1=String.Format("{0}:{1}:{2}",header.UserName,stringha2=String.Format("{0}:{1}",stringcomputedResponse=ha1,header.Nonce,once,"auth",if pareOrdinal(header.Response,computedResponse0較請求的Hash值與正確的可的Hash值是否相同,相則則表示驗(yàn)證通過,否則失{//digestcomputedmatchesthevaluesentbyinthe//Lookslikeanauthentic!Createa varclaims=new newClaim(ClaimTypes.Name, new ClaimsPrincipalprincipal=newClaimsPrincipal(new[]{ClaimsIdentity(claims,"Digest") Thread.CurrentPrincipal= if(HttpContext.Current!= HttpContext.Current.User=var=newGenericPrincipal(newGenericIdentity(header.UserName),Thread.CurrentPrincipal=if(HttpContext.Current!={HttpContext.Current.User=}}}}HttpResponseMessageresponse=awaitbase.SendAsync(request,if(response.StatusCode=={response.Headers.WwwAuthenticate.Add(new}return}catch{varresponse=return}}}publicclass{publicHeader(){publicHeader(stringheader,string{stringkeyValuePairs=header.Rece("\"",foreach(stringkeyValuePairin{intindex= stringkey=keyValuePair.Substring(0,stringvalue=keyValuePair.Substring(index+switch{case"username":this.UserName=value;case"realm":this.Realm=value;case"nonce":this.Nonce=value;case"uri":this.Uri=value;case"nc":this.NounceCounter=value;case once=value;case"response":this.Response=value;case"method":this.Method=value;}}ifthis.Method=}publicstringCnonce{get;privateset;publicstringNonce{get;privateset;publicstringRealm{get;privateset;publicstringUserName{get;privateset;publicstringUri{get;privateset;publicstringResponse{get;privateset;publicstringMethod{get;privateset;publicstringNounceCounter{get;privateset;//Thispropertyisusedbythehandlertogenerate//nonceandgetitreadytobepackagedin//WWW-Authenticateheader,aspartof401publicstaticHeaderGetUnauthorizedResponseHeader(HttpRequestMessage{varhost=returnnew{Realm=Nonce=}publicoverridestring{StringBuilderheader=newheader.AppendFormat(",qop=\"{0}\"",return}}publicclass{privatestaticConcurrentDictionary<string,Tuple<int,nonces=newConcurrentDictionary<string,Tuple<int,publicstaticstring{byte[]bytes=newusing(varrngProvider=new{}stringnonce=nonces.TryAdd(nonce,newTuple<int,DateTime>(0,return}publicstaticboolIsValid(stringnonce,string{Tuple<int,DateTime>cachedNonce=//nonces.TryGetValue(nonce,outnonces.TryRemove(nonceoutcachedNonce);//nonceif(cachedNonce!=null)//nonceis{//noncecountisgreaterthantheoneinif(Int32.Parse(nonceCount)>{//noncehasnotexpiredif(cachedNonce.Item2>{//updatethedictionarytoreflectthenoncecountjustreceivedthis//nonces[nonce]=newTuple<int,//Everythinglooksok-servernonceisfreshandnoncecountseems//incremented.Doesnotlooklikerereturn}}}return}}}1using2using3using45namespace6{7publicstaticclass8{9publicstaticstringToMD5Ha
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體質(zhì)監(jiān)測與評估體系構(gòu)建-洞察分析
- 隨機(jī)數(shù)加密技術(shù)-洞察分析
- 推送通知機(jī)制-洞察分析
- 藥物聯(lián)合用藥療效優(yōu)化-洞察分析
- 隧道地質(zhì)風(fēng)險評估-第3篇-洞察分析
- 鐵路運(yùn)輸裝備智能化升級-洞察分析
- 鐵路運(yùn)輸事故應(yīng)急處理-洞察分析
- 預(yù)制構(gòu)件經(jīng)濟(jì)性探討-洞察分析
- 《汽車電路識圖》課件
- 二年級下冊《買鮮花》課件版
- 模具管理程序文件
- 女子水晶樂坊
- 漢語中的詞語詞性分類(課堂)課件
- 2023-2024學(xué)年廣西壯族自治區(qū)南寧市小學(xué)語文五年級期末高分試題附參考答案和詳細(xì)解析
- DB44T 1315-2014物業(yè)服務(wù) 檔案管理規(guī)范
- 基本醫(yī)療保險異地就醫(yī)登記備案申請表
- 非線性光纖光學(xué)六偏振效應(yīng)PPT
- 昌樂二中271課堂教學(xué)模式
- 馬克思主義基本原理試題及答案(超星學(xué)習(xí)通)
- 衛(wèi)生專業(yè)技術(shù)資格任職聘用證明表
- 《小班幼兒分離焦慮研究開題報告(含提綱)》
評論
0/150
提交評論