#asp.net-mvc #cookies #asp.net-web-api2 #.net-core
#asp.net-mvc #файлы cookie #asp.net-web-api2 #.net-ядро
Вопрос:
У меня есть два приложения MVC, MVC web и MVC web api. Приложение MVC запущено под «http://localhost:8241 /» и веб-api MVC работает под управлением «http://localhost:8243 /«. Я настроил аутентификацию cookie в приложении MVC. вот код в startup.cs
app.UseCookieAuthentication(options =>
{
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.AuthenticationScheme = "CookieAuthHRMS";
options.CookieName = "access_token";
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.SlidingExpiration = true;
options.LoginPath = new Microsoft.AspNet.Http.PathString("/Account/Login");
options.LogoutPath = new Microsoft.AspNet.Http.PathString("/Account/Logout");
options.AccessDeniedPath = new Microsoft.AspNet.Http.PathString("/Account/AccessDenied");
});
Он работает нормально. Я могу увидеть файл cookie access_token с помощью инструмента разработчика Chrome. Итак, я хочу добавить аутентификацию в свой проект web api. Итак, я сделал точно такой же код в Startup.cs проекта web api. создайте контроллер с именем conjunctioncontroller для аутентификации веб-api. вот код:
[HttpPost("ConjunctionLI/{username}/{password}")]
public async Task<bool> ConjunctionLI(string username, string password)
{
UsersEntity usrEty = await _usr.findsUsers(username, password);
if (usrEty != null)
{
List<Claim> userClaims = new List<Claim>
{
new Claim("userId",usrEty.UserId.ToString()),
new Claim("EmployeeId",usrEty.EmployeeID),
new Claim(ClaimTypes.Name, usrEty.UserName),
};
ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "local"));
await HttpContext.Authentication.SignInAsync("CookieAuthHRMS", principal);
}
return true;
}
В веб-приложении Mvc я вызвал контроллер соединения после успешного входа в систему. вот код в действии входа контроллера учетной записи.
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel lgvm)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindAsync(lgvm.UserName, lgvm.Password);
string resu<
if(user!= null)
{
//call api service
using (var client = new HttpClient())
{
string apiSec = @"http://localhost:8243/api/Conjunction/ConjunctionLI/" lgvm.UserName "//" lgvm.Password;
HttpResponseMessage response = await client.PostAsync(apiSec, null);
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
}
await SignInAsync(user, lgvm.RememberMe);
return RedirectToAction("Index", "Home");
}
}
return RedirectToAction("AccessDenied","Account");
}
Я поместил тег [Authorize] в один из контроллеров веб-api, но все равно не удалось. Несмотря на то, что я использовал » await HttpContext.Проверка подлинности.SignInAsync («CookieAuthHRMS», принципал); «как и в веб-приложении MVC, проверка подлинности по-прежнему не выполняется.
Есть ли какой-нибудь правильный способ сделать это? Как я могу аутентифицировать проект веб-api?
Лучшие Rgd, frog
Комментарии:
1. Токен доступа не может работать на двух сайтах с разными номерами портов. Какой именно код ошибки вы получаете?
2. нет ошибки, просто не работает
3. Несмотря на то, что я выполняю вход, он все еще не авторизован.
4. Используйте один и тот же machineKey в обоих файлах web.config приложения.
5. У меня нет файла web.config, потому что я использую .net core. как мне это сделать?
Ответ №1:
Это выполняется путем добавления промежуточного программного обеспечения для защиты данных в Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(Configure);
services.AddMvc();
services.AddDataProtection();
services.ConfigureDataProtection(configure => {
configure.SetApplicationName("HRMS");
configure.PersistKeysToFileSystem(new DirectoryInfo(@"C:shared-auth-ticket-keys"));
});
}