web-dev-qa-db-ja.com

RestSharp HttpBasicAuthentication-例

RestSharpとWEB APIサービスを使用するWPFクライアントがあります。次のようにHttpBasicAuthenticatorを使用しようとしています。

RestRequest login = new RestRequest("/api/users/login", Method.POST);
var authenticator = new HttpBasicAuthenticator("admin","22");
authenticator.Authenticate(Client, login);
IRestResponse response = Client.Execute(login); 

POSTリクエストは次のようになります。

POST http://localhost/api/users/login HTTP/1.1
Authorization: Basic YWRtaW46MjI=
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp/105.1.0.0
Host: dellnote:810
Content-Length: 0
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
  1. このフィールドを処理するにはどうすればよいですかAuthorization: Basic YWRtaW46MjI=サーバー側で?このヘッダーからユーザー名とパスワードを取得しますか?
  2. サーバーからクライアントにセキュリティトークンを返し、クライアントサイドで保存するにはどうすればよいですか?

セキュリティトークンに基づく単純な認証を取得する必要がありますが、このプロセスのすべての側面を説明する例を見つけることができません。誰かがクライアント側とサーバー側を含む(そしてRestSharpを使用する)完全な例を教えてくれますか。

12
RomaS

new SimpleAuthenticator("username", username, "password", password) did [〜#〜] not [〜#〜]一緒に働いてください。

ただし、次のように機能しました。

var client = new RestClient("http://example.com");
client.Authenticator = new HttpBasicAuthenticator(userName, password);

var request = new RestRequest("resource", Method.GET);
client.Execute(request);
16
Gerhard Powell

RestSharpドキュメントから:

var client = new RestClient("http://example.com");
client.Authenticator = new SimpleAuthenticator("username", "foo", "password", "bar");

var request = new RestRequest("resource", Method.GET);
client.Execute(request);

このリクエスト用に生成されるURLは http://example.com/resource?username=foo&password=bar になります

したがって、他のパラメーターと同じようにパスワードを取得します(ただし、セキュリティ上の理由から、POST method、次にGETを使用することをお勧めします)。

クッキーに関しては、これをチェックしてください: https://msdn.Microsoft.com/en-us/library/system.windows.application.setcookie.aspx

https://msdn.Microsoft.com/en-us/library/system.windows.application.getcookie.aspx

それが役に立てば幸い

5
Felix Av

または、認証ヘッダー値(サーバー側)の取得に関する最初の質問に ヘッダーから基本認証資格情報を取得するにはどうすればよいですか?

private UserLogin GetUserLoginCredentials()
{
    HttpContext httpContext = HttpContext.Current;
    UserLogin userLogin;
    string authHeader = httpContext.Request.Headers["Authorization"];

    if (authHeader != null && authHeader.StartsWith("Basic"))
    {
        string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
        Encoding encoding = Encoding.GetEncoding("iso-8859-1");
        string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
        int seperatorIndex = usernamePassword.IndexOf(':');

        userLogin = new UserLogin()
        {
            Username = usernamePassword.Substring(0, seperatorIndex),
            Password = usernamePassword.Substring(seperatorIndex + 1)
        };
    }
    else
    {
        //Handle what happens if that isn't the case
        throw new Exception("The authorization header is either empty or isn't Basic.");
    }
    return userLogin;
}

このメソッドの使用法は次のとおりです。

UserLogin userLogin = GetUserLoginCredentials();

以下もご覧ください: A-WebAPI-Basic-Authentication-Authorization-Filter

トークンを返すことに関する2番目の質問(サーバー側)の代替回答:

var httpResponseMessage = Request.CreateResponse();

TokenResponse tokenResponse;
bool wasAbleToGetAccesToken = _identityServerHelper.TryGetAccessToken(userLogin.Username, userLogin.Password,
            platform, out tokenResponse);

httpResponseMessage.StatusCode = wasAbleToGetAccesToken ? HttpStatusCode.OK : HttpStatusCode.Unauthorized;
httpResponseMessage.Content = new StringContent(JsonConvert.SerializeObject(tokenResponse),
            System.Text.Encoding.UTF8, "application/json");

return httpResponseMessage;
1