ASP.NET Web API Аутентификация
Я ищу для проверки подлинности пользователя из клиентского приложения при использовании веб-API ASP.NET. Я посмотрел все видео на сайте, а также прочитал этот пост на форуме.
Ввод [Authorize]
атрибут правильно возвращает 401 Unauthorized
статус. Однако мне нужно знать, как разрешить пользователю входить в API.
Я хочу предоставить учетные данные пользователя из приложения Android в API, зарегистрировать пользователя, а затем предварительно пройти аутентификацию всех последующих вызовов API.
4 ответа
разрешить пользователю входить в API
Вам необходимо отправить действительный файл cookie проверки подлинности с помощью форм. Этот файл cookie обычно отправляется сервером при аутентификации (LogOn
действие), позвонив [FormsAuthentication.SetAuthCookie
метод (см. MSDN).
Таким образом, клиент должен выполнить 2 шага:
- Отправить HTTP-запрос
LogOn
действие, отправив имя пользователя и пароль. В свою очередь это действие будет называтьFormsAuthentication.SetAuthCookie
метод (в случае, если учетные данные действительны), который, в свою очередь, установит cookie-файл проверки подлинности форм в ответе. - Отправить HTTP-запрос
[Authorize]
защищенное действие, отправив вдоль cookie проверки подлинности формы, полученные в первом запросе.
Давайте возьмем пример. Предположим, что в вашем веб-приложении определены 2 контроллера API:
Первый ответственный за обработку аутентификации:
public class AccountController : ApiController
{
public bool Post(LogOnModel model)
{
if (model.Username == "john" && model.Password == "secret")
{
FormsAuthentication.SetAuthCookie(model.Username, false);
return true;
}
return false;
}
}
и второй, содержащий защищенные действия, которые могут видеть только авторизованные пользователи:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
Теперь мы можем написать клиентское приложение, использующее этот API. Вот тривиальный пример консольного приложения (убедитесь, что вы установили Microsoft.AspNet.WebApi.Client
а также Microsoft.Net.Http
Пакеты NuGet):
using System;
using System.Net.Http;
using System.Threading;
class Program
{
static void Main()
{
using (var httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(
"http://localhost:26845/api/account",
new { username = "john", password = "secret" },
CancellationToken.None
).Result;
response.EnsureSuccessStatusCode();
bool success = response.Content.ReadAsAsync<bool>().Result;
if (success)
{
var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
Console.WriteLine(secret.Result);
}
else
{
Console.WriteLine("Sorry you provided wrong credentials");
}
}
}
}
А вот как выглядят 2 HTTP-запроса в сети:
Запрос аутентификации:
POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive
{"username":"john","password":"secret"}
Ответ аутентификации:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close
true
Запрос на защищенные данные:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
Ответ для защищенных данных:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close
"This is a top secret material that only authorized users can see"
Я беру андроид в качестве примера.
public abstract class HttpHelper {
private final static String TAG = "HttpHelper";
private final static String API_URL = "http://your.url/api/";
private static CookieStore sCookieStore;
public static String invokePost(String action, List<NameValuePair> params) {
try {
String url = API_URL + action + "/";
Log.d(TAG, "url is" + url);
HttpPost httpPost = new HttpPost(url);
if (params != null && params.size() > 0) {
HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
httpPost.setEntity(entity);
}
return invoke(httpPost);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
return null;
}
public static String invokePost(String action) {
return invokePost(action, null);
}
public static String invokeGet(String action, List<NameValuePair> params) {
try {
StringBuilder sb = new StringBuilder(API_URL);
sb.append(action);
if (params != null) {
for (NameValuePair param : params) {
sb.append("?");
sb.append(param.getName());
sb.append("=");
sb.append(param.getValue());
}
}
Log.d(TAG, "url is" + sb.toString());
HttpGet httpGet = new HttpGet(sb.toString());
return invoke(httpGet);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
return null;
}
public static String invokeGet(String action) {
return invokeGet(action, null);
}
private static String invoke(HttpUriRequest request)
throws ClientProtocolException, IOException {
String result = null;
DefaultHttpClient httpClient = new DefaultHttpClient();
// restore cookie
if (sCookieStore != null) {
httpClient.setCookieStore(sCookieStore);
}
HttpResponse response = httpClient.execute(request);
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
for (String s = reader.readLine(); s != null; s = reader.readLine()) {
builder.append(s);
}
result = builder.toString();
Log.d(TAG, "result is ( " + result + " )");
// store cookie
sCookieStore = ((AbstractHttpClient) httpClient).getCookieStore();
return result;
}
Внимание, пожалуйста: i.localhost не может быть использован. Android-устройство выглядит localhost как сам хост. ii. При развертывании веб-API в IIS необходимо открыть проверку подлинности формы.
Используйте этот код и получите доступ к базе данных
[HttpPost]
[Route("login")]
public IHttpActionResult Login(LoginRequest request)
{
CheckModelState();
ApiResponse<LoginApiResponse> response = new ApiResponse<LoginApiResponse>();
LoginResponse user;
var count = 0;
RoleName roleName = new RoleName();
using (var authManager = InspectorBusinessFacade.GetAuthManagerInstance())
{
user = authManager.Authenticate(request);
} reponse(ok)
}
Выберите «Однопользовательская аутентификация» — это создаст базу данных аутентификации для создания пользователей в файле App_Data>*.mdf sql. Зарегистрированные пользователи хранятся в этой таблице dbo.AspNetUsers -> Обратите внимание, что пароль хранится в хэш-формате здесь, в этой таблице, с помощью это будет полезно для входа на веб-сайт, которому присвоен атрибут [Autorize] --> он вызовет функцию автоматически созданной страницы ==> /api/account/register
Сценарий страницы регистрации можно использовать, как показано ниже: $(document).ready(function () {
$('#lnkClose').click(function () {
$('#divErrorText').hide('fade');
});
$('#btnRegister').click(function () {
$.ajax({
url: '/api/account/register',
method: 'POST',
data: {
Email: $('#txtEmail').val(),
Password: $('#txtPassword').val(),
ConfirmPassword: $('#txtConfirmPassword').val()
},
success: function () {
$('#successModel').modal('show');
},
error: function (jqXHR) {
$('#divErrorText').text(jqXHR.responseText);
$('#divError').show('fade');
$('#divErrorText').show('fade');
}
})
});
});