Авторизация в приложении CRUD на стороне сервера Blazor для зарегистрированных пользователей для просмотра их указанных c данных (не всех данных, созданных всеми пользователями) - PullRequest
1 голос
/ 11 января 2020

Мне очень плохо и немного глупо задавать этот вопрос, так как многим экспертам он может показаться простым, но это заставило меня работать бесконечно в течение нескольких дней без правильной работы моего решения, что немного расстраивает. Любая помощь, чтобы вытащить меня из этого прошлого, будет высоко оценена. Ссылка на код находится в конце этого поста. Все, что мне нужно, - это использовать способ авторизации в приложении Blazor CRUD, чтобы вошедшие в систему пользователи могли просматривать только данные, указанные для них c (созданные ими после входа в систему).

Что такое проект ? Я создал список напоминаний о назначениях (для учащихся), в котором дочерний компонент «AssignmentDetail» вложен в родительский объект с именем «AssignmentReminderList». Дочерний компонент: имеет форму для включения входных данных (как модальную) и показывает список назначений:

Важные части кода родительского компонента:

@if (assignmentList == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Assignments</th>
                <th>Status</th>
                <th>Due Date</th>
                <th>Edit</th>
                <th>Delete</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var assignment in assignmentList)
            {
                <tr>
                    <td>@assignment.Title</td>
                    <td>@assignment.Status</td>
                    <td>@assignment.DueDate</td>
                    <td><input type="button" class="btn btn-primary" @onclick="(()=>PrepareForEdit(assignment))" data-toggle="modal" data-target="#assignmentModal" value="Edit" /></td>
                    <td><input type="button" class="btn btn-primary" @onclick="(()=>PrepareForDelete(assignment))" data-toggle="modal" data-target="#confirmDeleteModal" value="Delete" /></td>
                </tr>
            }
        </tbody>
    </table>
}
<div>
    <input type="button" data-toggle="modal" data-target="#assignmentModal" class="btn btn-primary" value="Add Task"
           @onclick="(()=>InitializeAssignmentObject())" />
</div>
<ConfirmDelete OnClick="@Delete"></ConfirmDelete>
<AssignmentDetail AssignmentObject="assignmentObject" OnSave="@Refreshed">
    <CustomHeader>@customHeader</CustomHeader>
</AssignmentDetail>


@code {
        List<AssignmentReminder> assignmentList;
        AssignmentReminder assignmentObject = new AssignmentReminder();
        string customHeader = string.Empty;
        private readonly ApplicationDbContext _db;


        protected override async Task OnInitializedAsync()
        {
            assignmentList = await service.GetAssignments();
           await GetUserDetails();

        }

        string Message = "";
        public List<AssignmentReminder> AssignmentReminders { get; set; }



        private async Task GetUserDetails()
        {
            var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
            var user = authState.User;

            //if (user.Identity.IsAuthenticated)
            //{
            var currentUser = await UserManager.GetUserAsync(user);

            var currentUserId = currentUser.Id;

            assignmentList = await _db.assignments.Where(a => a.OwnerID == currentUserId).ToListAsync();

        }

} 

Модель:

public class AssignmentReminder
    {

        [Key]
        public int Id { get; set; }
        //User ID from AspNetUser table
        public string OwnerID { get; set; }
        [Required(ErrorMessage = "Assignment title is required")]
        [StringLength(50, ErrorMessage = "Title is too long.")]
        public string Title { get; set; }

        [Required(ErrorMessage = "Status is required")]
        public string Status { get; set; }

        [Required(ErrorMessage = "Due Date is required")]
        public DateTime DueDate { get; set; }

    }  

Теперь проблема в том, что метод GetUserDetails (), который я создал для фильтрации и получения данных, указанных c для пользователя, заканчивается во время выполнения Null Reference Exception, так как я не могу найти способ заполнить OwnerId (в Таблице назначений, которая совпадает с userId из таблицы AspNetUser), когда запись создается в таблице назначений.

Проект доступен по адресу: https://github.com/krchome/BlazorAssignmentReminder (для всех, кто хочет попробовать его в конце)

1 Ответ

0 голосов
/ 14 января 2020

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

Итак, я добавил это:

    private async Task HandleValidSubmit()
    {
        if (AssignmentObject.Id == 0)
        {
            var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
            var user = authState.User;
            var currentUser = await UserManager.GetUserAsync(user);
            var currentUserId = currentUser.Id;
            AssignmentObject.OwnerID = currentUserId;
            await service.AddAssignment(AssignmentObject);
        }
        else
        {
            await service.EditAssignment(AssignmentObject);
        }
        await CloseTaskModal();
        //await HideInput();
        // await ShowInput();
        await OnSave.InvokeAsync(AssignmentObject);
        // DataChanged?.Invoke();
    }

Я также добавил способ извлечения только записей для текущего пользователя.

Для вашей службы я добавил это:

        public async Task<List<AssignmentReminder>> GetAssignmentsForUser(string OwnerID)
        {

            return await _context.assignments.Where(x => x.OwnerID == OwnerID).ToListAsync();
        }

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

@page "/taskreminder"

@using CRUDAppDemo.Data
@using CRUDAppDemo.Services
@using System.Data.Entity
@inject IAssignmentReminderService service
@inject IJSRuntime jsRuntime
@inject AuthenticationStateProvider AuthenticationStateProvider
@*@inject AssignmentReminderListAuthorization authorization*@
@using Microsoft.AspNetCore.Identity;
@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor httpContextAccessor
@inject UserManager<IdentityUser> UserManager
@*@inject DI_BasePageModel di_page
    @inject AssignmentReminderListAuthorization authorize*@

<h1>Assignment Reminder</h1>


@if (assignmentList == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Assignments</th>
                <th>Status</th>
                <th>Due Date</th>
                <th>Edit</th>
                <th>Delete</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var assignment in assignmentList)
            {
                <tr>
                    <td>@assignment.Title</td>
                    <td>@assignment.Status</td>
                    <td>@assignment.DueDate</td>
                    <td><input type="button" class="btn btn-primary" @onclick="(()=>PrepareForEdit(assignment))" data-toggle="modal" data-target="#assignmentModal" value="Edit" /></td>
                    <td><input type="button" class="btn btn-primary" @onclick="(()=>PrepareForDelete(assignment))" data-toggle="modal" data-target="#confirmDeleteModal" value="Delete" /></td>
                </tr>
            }
        </tbody>
    </table>
}
<div>
    <input type="button" data-toggle="modal" data-target="#assignmentModal" class="btn btn-primary" value="Add Task"
           @onclick="(()=>InitializeAssignmentObject())" />
</div>
<ConfirmDelete OnClick="@Delete"></ConfirmDelete>
<AssignmentDetail AssignmentObject="assignmentObject" OnSave="@GetUserDetails">
    <CustomHeader>@customHeader</CustomHeader>
</AssignmentDetail>


@code {
    List<AssignmentReminder> assignmentList;
    AssignmentReminder assignmentObject = new AssignmentReminder();
    string customHeader = string.Empty;
    private readonly ApplicationDbContext _db;


    protected override async Task OnInitializedAsync()
    {
        await GetUserDetails();
    }

    private void InitializeAssignmentObject()
    {
        assignmentObject = new AssignmentReminder();
        assignmentObject.DueDate = DateTime.Now;
    }

    private void PrepareForEdit(AssignmentReminder assignmentReminder)
    {
        customHeader = "Edit Task";
        assignmentObject = assignmentReminder;
    }

    private void PrepareForDelete(AssignmentReminder assignmentReminder)
    {
        assignmentObject = assignmentReminder;
    }

    private async Task Delete()
    {
        var task = await service.DeleteAssignment(assignmentObject.Id);
        await jsRuntime.InvokeAsync<object>("HideModal", "confirmDeleteModal");
        assignmentList = await service.GetAssignments();
        assignmentObject = new AssignmentReminder();

    }
    //new code

    string Message = "";
    public List<AssignmentReminder> AssignmentReminders { get; set; }

    private async Task GetUserDetails()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        {
            var currentUser = await UserManager.GetUserAsync(user);

            var currentUserId = currentUser.Id;

            assignmentList = await service.GetAssignmentsForUser(currentUserId);

        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...