-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnotes.txt
144 lines (108 loc) · 6.44 KB
/
notes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
create project > asp.net web application (.net framework)
- kad bude trebalo controller -> add new controller > web api a ne mvc
- kad pokrenes aplikaciju (mozda treba set as startup prvo) vidis URL
- tek kad se vrti aplikacija Postman daje rezultate
- onaj default route gdje pise api/controller ne znaci da je api https://localhost:44373/, nego doslovno ovako https://localhost:44373/api/controller xD
- posto ima puno return null u repositoriju, da znam koji je null, dodam poruku i promijenim metodu ovako:
Repository:
- prije - public async Task<List<RegisteredUser>> GetAllAsync()
- novo - public async Task<(List<RegisteredUser>, string)> GetAllAsync()
IRepository:
- Task<(List<RegisteredUser>, string)> GetAllAsync();
Service:
public async Task<(List<RegisteredUser>, string)> GetAllAsync()
{
(List<RegisteredUser> list, string message) = await Repository.GetAllAsync();
- i tako dalje, vidi u kodu, to u zagradi se zove Tuple
- i sad ne radi jer koristim dependency injection a nisam instalirao autofac
- instaliram autofac nuget package i onaj za webapi2
- https://autofac.readthedocs.io/en/latest/integration/webapi.html
- pravim DependencyInjectionConfig file u AppStart u kontroleru:
...
public static void ConfigureContainer()
{
var builder = new ContainerBuilder();
var config = GlobalConfiguration.Configuration;
// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UserService>().As<IUserService>();
builder.RegisterType<UserRepository>().As<IUserRepository>();
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
...
- dodajem liniju na kraj global.asax: DependencyInjectionConfig.ConfigureContainer();
- errori zbog nepoklapanja verzija, editirao webconfig, dodao sljedece:
...
<dependentAssembly>
<assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.0.1.0" newVersion="7.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0" />
</dependentAssembly>
...
- verzija za webhttp se nadje u webapi folderu, prosiris references, nadjes ga, kliknes daoznaci, i na dnu pod properties pise verzija
- za paging, sorting, filtering pravim novi class library Common, i modele sa propertiesima po kojima ce se radit paging, sorting, filtering
- kod mene SearchParam, PageParam i SortParam
- ne zaboraviti [FromUri] u kontroleru
- u Postmanu je Key onaj npr @role (dakle role je key) a ne UserRole, iako moze pisati i Role, nije case sensitive
- cini se da i za key ni value nije case sensitive
- sorting drukcije malo jer se SQL buni, za sorting u Postmanu case sensitive
- kod sortiranja, OrderByWhat se buni kod npr Title za review, jer nije jedna rijec ... GPT4 predlaže CAST({sort.OrderByWhat} AS NVARCHAR(MAX)) ali neću dirati jer realno ni ne treba sortirati prema naslovu reviewa ili opisima igre ili reviewa
- Average Rating za BoardGame malo komplicira stvari, dodao izmjene u GetAll, GetOneById i onaj zadnji sa parametrima
...
AUTHENTICATION
- instalirati System.IdentityModel.Tokens.Jwt NuGet package
- AuthenticationController i FindUser metode u servis i repository
- unutar WebAPI novi folder Filters i novu klasu JwtAuthenticationAttribute
- kao i ranije sa verzijama, morao izmijeniti webconfig za System.Threading.Tasks.Extensions
- u Postman POST metodu sa username i password u bodyu treba returnat token
- onda za autorizaciju unutar Postmana, koju god metodu da saljem, odem u Header i dodam Key "Authorization" i Value "Bearer paste_token", pejstas kobasicu token nakon Bearer ... i trebalo bi returnat normalni npr get all
- za metode koje zelim ogranicit da zahtjevaju ulogiranog usera stavim [JwtAuthentication] iznad HttpGet i sl
AUTORIZACIJA
- nova klasa u Filters - AuthorizeRoleAttribute
- izmjene u JwtAuthenticationAttribute
- dodati [AuthorizeRole("User")] ispod autentikacije u kontrolerima gdje treba
...
- za ograniciti odredjenim rolama koje parametre mogu vidjeti, potrebno je napraviti DTO model za tu rolu
- samo za Review i BoardGame jer vidit sve usere smije samo admin tak ionak
- napravio RoleIsUserDTOs folder i tamo smjestio za User rolu
- u kontroleru mapirao shortList za Usera u npr GetAll:
(List<BoardGame> list, string message) = await Service.GetAllAsync();
bool roleIsUser = RequestContext.Principal.IsInRole("User");
if (roleIsUser)
{
var shortList = list.Select(game => new BoardGameDTO
{
Title = game.Title,
Description = game.Description,
AverageRating = game.AverageRating
}).ToList();
return Request.CreateResponse(HttpStatusCode.OK, new { Message = message, List = shortList });
}
return Request.CreateResponse(HttpStatusCode.OK, new { Message = message, List = list });
- vraca Id null jer Postman valjda mora vracati Id a nije mapiran, nema veze
- sad ic po kontrolerima i podesit autentikaciju i autorizaciju i DTOs
- za mapiranje trenutno logiranog usera za UpdatedBy, CreatedBy i sl
- dodati liniju u metodu u repositoriju: string authenticatedUser = System.Web.HttpContext.Current.User.Identity.Name;
- repository ga ne vidi, tako da add reference > Assemblies > System.Web
- za dohvacanje role u repositorij:
string role = null;
ClaimsPrincipal principal = System.Web.HttpContext.Current.User as ClaimsPrincipal;
if (principal != null)
{
Claim roleClaim = principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Role);
if (roleClaim != null)
{
role = roleClaim.Value;
}
}
- ako treba provjeriti sta sve bude spremljeno u tokenu, ovdje pogledati https://jwt.io/
...
POSTMAN
- kad nema parametara ide samo get all
- kada ima parametara ide Params tab
- kad treba post/put ide u body - raw - json
- kad treba token ide u header - authorization - Bearer (token)