Методы Get / Post / Put для текущих зарегистрированных пользователей - PullRequest
0 голосов
/ 21 сентября 2018

Так что все работает нормально. Я просто не уверен, что так и должно быть.Вот пример изменения адреса доставки для текущего зарегистрированного пользователя.
Это контроллер, который я сделал:

    [Route("addShippingAdress")]
    [HttpPut] 
    public void addAddress([FromBody] string newShippingAdress)
    {
       string userId = User.Identity.GetUserId();
       db.Users.Find(userId).ShippingAdress = newShippingAdress;
       db.SaveChanges();
    }

Это запрос Ajax об изменении адреса доставки:

    $.ajax({
            url: 'addShippingAdress',
            method: 'PUT', 
            contentType: 'application/json',
            headers: {
                'Authorization': 'Bearer '
                    + sessionStorage.getItem("accessToken")
            },
            dataType: "text",
            data: JSON.stringify("some new adress"),
            success: function (data) {
            },
            error: function (data) {
            }
        });

и это запрос Ajax, который я использую для входа в систему:

$.ajax({
                url: '/token',
                method: 'POST',
                contentType: 'application/json',
                data: {
                    username: $('#txtUserName').val(),
                    password: $('#txtPassword').val(),
                    grant_type: 'password'
                },
                success: function (response) {
                    sessionStorage.setItem("accessToken", response.access_token);
                    sessionStorage.setItem("userName", response.userName);
                    window.location.href = "Data.html";
                },
                error: function (data) {
                console.log(data)
                }
            });

Чтобы быть более точным, в будущем, когда я захочу получить некоторые свойства вошедшего в систему пользователя или изменитьнекоторые из свойств вошедшего в систему пользователя, например адрес доставки в примере, который я вам дал, это то, как я это делаю?Нужно ли мне отправлять токен доступа с каждым Ajax-запросом следующим образом:

...
headers: {
'Authorization': 'Bearer '
+ sessionStorage.getItem("accessToken")
},
...

для каждого контроллера, который я хочу использовать для вошедшего в систему пользователя, а затем находить вошедшего в систему пользователя, например:

 string userId = User.Identity.GetUserId();
 var loggedInUser = db.Users.Find(userId);
 loggedInUser... // some logic here

Это правильный способ сделать это?Если так, то где контроллер считывает маркер доступа, который я отправляю в заголовке запроса Ajax?Когда я отправляю адрес доставки в теле, контроллер может прочитать его с помощью атрибута [FromBody], например:

public void addAddress([FromBody] string newShippingAdress)

Но где он читает маркер доступа, который я отправляю в заголовке?Я новичок, поэтому наберитесь терпения и понимания.Хорошего дня!

1 Ответ

0 голосов
/ 23 сентября 2018

В вашем проекте API создайте пользовательский фильтр аутентификации следующим образом:

Создайте класс TokenAuthenticationFilterAttribute, который наследуется от System.Web.Http.Filters.AuthorizationFilterAttribute class.

Переопределите метод OnAuthorization следующим образом

public override void OnAuthorization(HttpActionContext actionContext)
{
    // Read the authorization header from the request
    var auth = actionContext.Request.Headers.Authorization;

    if(auth != null && auth.Scheme.ToLower().Equals("bearer", StringComparison.InvariantCultureIgnoreCase))
    {
        // Validate the header value against database

        // If validation fails, send appropriate response
        actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
    }
}

Используйте этот фильтр для ваших методов действий или контроллера следующим образом:

[Route("addShippingAdress")]
[HttpPut] 
[TokenAuthenticationFilter]
public void addAddress([FromBody] string newShippingAdress)
{
    string userId = User.Identity.GetUserId();
    db.Users.Find(userId).ShippingAdress = newShippingAdress;
    db.SaveChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...