亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

授權令牌在 ASP.NET Core 中未綁定

授權令牌在 ASP.NET Core 中未綁定

C#
慕工程0101907 2022-01-15 15:44:33
我正在調用這樣的 REST api:HttpClient client;var uri = new Uri(Const.GetUserAccount);client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("accessToken", App.AccessToken);var response = await client.GetAsync(uri);這是我的動作簽名(accessToken 為空):public async Task<ActionResult> GetAccountAsync([FromHeader] string accessToken)令牌位于 Request.Headers.HeaderAuthorization 中,其值為:"accessToken" + a space + the guid這似乎很奇怪。不應該有一個名稱值對嗎?喜歡:“accessToken”:“GUID”這就是它不具有約束力的原因嗎?如果是這樣,我該如何正確傳遞它?如果沒有,我做錯了什么?
查看完整描述

1 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

這就是它不具有約束力的原因嗎?


原因是您的操作方法需要accessToken來自請求標頭:


public async Task<ActionResult> GetAccountAsync([FromHeader] string accessToken)

AccessToken: xxx_yyy_zzz雖然您在 request 中沒有這樣的標頭。


如果您發送如下請求:


GET https://localhost:44323/api/values/account HTTP/1.1

accessToken : xxx_yyy_zzz

ModelBinder 將綁定accessToken.


如果是這樣,我該如何正確傳遞它?


我不確定您為什么要accessToken在操作方法內獲取。但是,如果您確實需要模型綁定的訪問令牌,那么至少有兩種方法可以做到這一點:


一種方法是更改您的操作方法以Authorization直接獲取標題:


public async Task<ActionResult> GetAccount2Async([FromHeader] string authorization) 

{

    if (String.IsNullOrEmpty(authorization)) { /* */ }

    if (!authorization.StartsWith("accessToken",StringComparison.OrdinalIgnoreCase)) { /* */ }


    var token = authorization.Substring("accessToken".Length).Trim();

    // ...

}

當您發送標頭為Authorization : accessToken xxx_yyy_zzz.


但是,上面的方法并不干凈。更好的方法是創建自定義ModelBinder.


首先讓我們創建一個虛擬類來保存 accessToken 值:


public class AccessTokenAuthorizationHeader

{

    public string TokenValue { get; set; }

}

這是一個簡單的模型綁定器,它將從 headers 中檢索訪問令牌:


public class AuthorizationHeaderBinder : IModelBinder

{

    const string DEFAULT_ACCESS_TOKEN_AUTH_HEADER_PREFIX = "accessToken";

    public Task BindModelAsync(ModelBindingContext bindingContext)

    {

        if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); }


        var modelName = bindingContext.BinderModelName;

        if (string.IsNullOrEmpty(modelName)) { modelName = DEFAULT_ACCESS_TOKEN_AUTH_HEADER_PREFIX; }


        var authorization = bindingContext.HttpContext.Request.Headers["Authorization"].FirstOrDefault();

        if (String.IsNullOrWhiteSpace(authorization)) {

            return Task.CompletedTask;

        }

        if (!authorization.StartsWith(modelName, StringComparison.OrdinalIgnoreCase)) {

            return Task.CompletedTask;

        }

        var token = authorization.Substring(modelName.Length).Trim();


        bindingContext.Result = ModelBindingResult.Success(new AccessTokenAuthorizationHeader() {

            TokenValue =token,

        });

        return Task.CompletedTask;

    }

}

最后,AccessTokenAuthorizationHeader用一個ModelBinderAttribute:


[ModelBinder(BinderType =typeof(AuthorizationHeaderBinder))]

public class AccessTokenAuthorizationHeader

{

    public string TokenValue { get; set; }

}

現在我們可以自動綁定它了:


[HttpGet("Account3")]

public async Task<ActionResult> GetAccount3Async(AccessTokenAuthorizationHeader accessToken) {

    var result =new JsonResult(accessToken?.TokenValue);

    return result;

}

讓我們用一個 requset 測試它:


GET https://localhost:44323/api/values/account3 HTTP/1.1

Authorization : accessToken 111111

響應將是:


HTTP/1.1 200 OK

Transfer-Encoding: chunked

Content-Type: application/json; charset=utf-8

Server: Kestrel

X-SourceFiles: =?UTF-8?B?RDpccmVwb3J0XDIwMThcOVw5LTEzXFNPLkF1dGhvcml6YXRpb25IZWFkZXJcQXBwXEFwcFxhcGlcdmFsdWVzXGFjY291bnQz?=

X-Powered-By: ASP.NET

Date: Thu, 13 Sep 2018 01:54:25 GMT


"111111"


查看完整回答
反對 回復 2022-01-15
  • 1 回答
  • 0 關注
  • 213 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號