ASP.Net Core доступ к файлу
Было создано веб приложение с базой данных и возможностью авторизации\регистрации по видеоурокам: https://www.youtube.com/watch?v=KNt1V72ZRAY&list=PLEtg-LdqEKXbgnzHp28hEDg8udku0jWLV&index=9 Решение - IdentityServer4 Сейчас структура приложения выглядит следующим образом:
Файл Secret.cshtml это тот файл, в который должен осуществлятся переход после успешной авторизации. К сжалению я не разорался как реализовать туда переход, в моём случае, если я указываю в login.cshtml ссылку на переход к этому файлу мне пишет что он недоступен, полагаю что это связанно с правами доступа, залогинится то я залогинился, но переход к файлу осуществляю без этих доступов. Как временное решение в файле AuthController.cs я прописал файлу Secret ОБЩИЙ ДОСТУП, что разумеется является не правильным решением
.input {
font-size: 20px;
font-family: Arial;
background-color: #fff;
width: 100%;
}
.header {
font-family: Arial;
color: #332600;
font-size: 30px;
text-align: center;
}
.button {
font-size: 20px;
background-color: #68dacd;
border-radius: 4px;
color: #332600;
font-family: Arial;
width: 100%;
height: 50px
}
.block {
margin-top: 10px;
}
.switch-button {
margin-top: 10px;
font-size: 15px;
border-radius: 4px;
color: #332600;
font-family: Arial;
display: inline-block;
text-align: center;
width: 100%;
}
@model LoginViewModel
<head>
<!--Подключем стиль-->
<link [email protected]("~/Styles/app.css") rel="stylesheet" type="text/css"/>
</head>
<!--Атрибут asp-controller назначает контроллер, используемый для создания URL-адреса. Следующий элемент перечисляет всех говорящих:-->
<!--Значение атрибута asp-action представляет имя действия контроллера, включенное в созданный атрибут-->
<!--method-Атрибут method сообщает серверу о методе запроса.-->
<!--/Auth/Login-->
<form asp-controller="Auth" asp-action="Login" method="post">
<!--<input>элементы типа hiddenпозволяют веб-разработчикам включать данные, которые не могут быть просмотрены или изменены пользователями при отправке формы-->
<!--asp-for - Создает атрибуты HTML id и name для имени выражения, указанного в атрибуте asp-for. asp-for="Property1.Property2" равно m => m.Property1.Property2. Имя выражения совпадает со значением атрибута asp-for -->
<input type="hidden" asp-for="ReturnUrl" value="/Auth/Secret"/>
<div class="header">Авторизоваться</div>
<div class="block">
<label>Имя пользователя</label>
<input asp-for="Username" class="input"/>
<span asp-validation-for="Username"></span>
</div>
<div class="block">
<label>Пароль</label>
<input asp-for="Password" class="input"/>
<span asp-validation-for="Password"></span>
</div>
<div class="block">
<button type="submit" class="button">Войти</button>
</div>
<a asp-controller="Auth" asp-action="Register"
asp-route-returnUrl="@Model.ReturnUrl" class="switch-button">Регистрация</a>
</form>
AuthController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IdentityServer4.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;
using Notes.Identity.Models;
namespace Notes.Identity.Controllers
{
public class AuthController : Controller
{
private readonly SignInManager<AppUser> _signInManager;
private readonly UserManager<AppUser> _userManager;
private readonly IIdentityServerInteractionService _interactionService;
public AuthController(SignInManager<AppUser> signInManager,
UserManager<AppUser> userManager,
IIdentityServerInteractionService interactionService) =>
(_signInManager, _userManager, _interactionService) =
(signInManager, userManager, interactionService);
[HttpGet]
public IActionResult Login(string returnUrl)
{
var viewModel = new LoginViewModel
{
ReturnUrl = returnUrl
};
return View(viewModel);
}
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel viewModel)
{
if (!ModelState.IsValid)
{
return View(viewModel);
}
var user = await _userManager.FindByNameAsync(viewModel.Username);
if (user == null)
{
ModelState.AddModelError(string.Empty, "User not found");
return View(viewModel);
}
var result = await _signInManager.PasswordSignInAsync(viewModel.Username,
viewModel.Password, false, false);
if (result.Succeeded)
{
return Redirect(viewModel.ReturnUrl);
}
ModelState.AddModelError(string.Empty, "Login error");
return View(viewModel);
}
[HttpGet]
public IActionResult Register(string returnUrl)
{
var viewModel = new RegisterViewModel
{
ReturnUrl = returnUrl
};
return View(viewModel);
}
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel viewModel)
{
if (!ModelState.IsValid)
{
return View(viewModel);
}
var user = new AppUser
{
UserName = viewModel.Username
};
var result = await _userManager.CreateAsync(user, viewModel.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, false);
return Redirect(viewModel.ReturnUrl);
}
ModelState.AddModelError(string.Empty, "Error occurred");
return View(viewModel);
}
/*[HttpGet]
public async Task<IActionResult> Logout(string logoutId)
{
await _signInManager.SignOutAsync();
var logoutRequest = await _interactionService.GetLogoutContextAsync(logoutId);
return Redirect(logoutRequest.PostLogoutRedirectUri);
}*/
[HttpGet]
public IActionResult Secret(string returnUrl)
{
var viewModel = new LogoutViewModel
{
ReturnUrl = returnUrl
};
return View(viewModel);
}
}
}
LoginViewModel
using System.ComponentModel.DataAnnotations;
namespace Notes.Identity.Models
{
public class LoginViewModel
{
[Required]
public string Username { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
public string ReturnUrl { get; set; }
}
}
Как сделать переход после авТоризации к файлу Secret правильно
