Wednesday, August 15, 2018

CRUD operations using ASP.NET Core 2.0 and In-memory database with Entity Framework

In this article, we will create a Web API with in-memory database using Entity Framework and ASP.NET Core 2.0 without any theoretical explanation. To know more on concepts and theory, my previous articles can be referred.

Let’s quickly create a new ASP.NET Core application by choosing API template and name it as ConferencePlanner. Add a new Model entity named Workshop inside a newly add Models folder as shown below:
public class Workshop
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Speaker { get; set; }
}
Here we are going to use in-memory class along with EF. So, we have to add a new class for setting up the database context as shown below:
public class ApplicationDbContext:DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> context):base(context)
    {
    }
}
Now we have to maintain multiple workshops under a conference. So, go ahead and add a DBSet in ApplicationContext class:
       
public DbSet<Workshop> Workshops { get; set; }       
 
Next is to register the DBContext with our application. So, add the below code in Startup.cs class:
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
   services.AddDbContext<ApplicationDbContext>(context => { context.UseInMemoryDatabase("ConferencePlanner"); });
}
Now we will add an Empty Controller using scaffolding options and name it as WorkshopController. Here we also have to associate database context with this controller. So, let’s associate the database context as shown below with some dummy data in it.
public class WorkshopController : Controller 
{
    private ApplicationDbContext _context; 
    public WorkshopController(ApplicationDbContext context)
    {
      _context = context;
       if (!_context.Workshops.Any()) 
       {
         _context.Workshops.Add(new Workshop 
                  { Name = "Event Management", Speaker = "Shweta"});
         _context.SaveChanges(); 
       }
    }
}
Let's add our first method to get a list of all workshops by adding below code:
[HttpPost]
public IEnumerable<Workshop> GetWorkshops(){return _context.Workshops; } 
Now before proceeding further, let’s quickly build the application and run it. Verify that it is working fine as expected.

[{"id":1,"name":"Event Management","speaker":"Shweta"}]

Now our base setup is ready. We can add add the CRUD operations. Let’ go ahead and add those.
[HttpPost]
public IActionResult AddWorkshop(Workshop workshop)
{
       if (workshop == null)
            return BadRequest();
       _context.Workshops.Add(workshop);
       _context.SaveChanges();
       return CreatedAtRoute("GetWorkshops", new { id = workshop.Id }, workshop);
}
In above code snippet, CreateAtRoute() method is associating newly added workshop object to exiting list of workshops. So, that it can be read by method GetWorkshops().
[HttpPut("{id}")] // means that this id will come from route
public IActionResult UpdateWorkshopByID(int id, [FromBody]Workshop ws)
{
    if (ws == null || ws.Id != id)
          return BadRequest();
    var workshop = _context.Workshops.FirstOrDefault(i => i.Id == id);
   if (workshop == null)
          return NotFound();
    workshop.Name = ws.Name;
    workshop.Speaker = ws.Speaker;
    _context.Workshops.Update(workshop);
    _context.SaveChanges();
    return new NoContentResult();
}
[HttpDelete]
public IActionResult DeleteWorkshopByID(int id)
{
    var workshop = _context.Workshops.FirstOrDefault(i => i.Id == id);
    if (workshop == null)
         return NotFound();
    _context.Workshops.Remove(workshop);
    _context.SaveChanges();
    return new NoContentResult();
}
Hope you enjoyed learning CRUD operations.

Thursday, August 2, 2018

Using DotNet Watcher with ASP.NET Core 2.0 Application

This is a feature which can be used on the command line to watch our web application. Whenever a C# class is modified and saved, it automatically re-compiles and re-runs whatever command we pass into it. In other words, as soon as C# code is modified and saved, the watcher will see those changes and re-compiles the code without a need to close the running application.

Let’s have a look on how it works.

Step 1:
Open any existing ASP.NET Core 2.0 project and open it’s project file by right clicking on project and clicking on ‘Edit XXX.csproj ‘ and add one more line as highlighted below:

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.2" />
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.2" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.1" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
</ItemGroup>

Step 2: Open command prompt and navigate to the project path. Type command as shown in below screenshot:












In above screenshot, I’m using run command as I want to re-run my application whenever code changes are there. If everything went well, then you will see the last line with a statement as ‘Application started. Press Ctrl+C to shut down.’ with an information about listening port.

Step 3: Copy the listening port URL and paste it on the browser as shown below:






You will notice that site is up and running along with much more information displayed on the command line window.

Step 4: Next is to navigate to any page in your application where you are going to modify any C# code. For me, I’m going to take About page. Initially my page is as below:










Now I’ll go to my AboutModel.cs and change message text. Quickly save the application and switch to command line window. You will notice that a red color text is displayed and application is automatically restarted. Here is the snapshot of command line:














Go to the browser and refresh the page, you will see that without closing the entire application you are able to see the updated text as shown below:









To know more about the released versions of Watcher tool, refer an official link. 

Hope you enjoyed leaning this tool.

Monday, July 30, 2018

Microsoft Announced Availability Of Blazor 0.5.0 Experimental Release

Microsoft announced the experimental release of Blazor 0.5.0 early last week. With this release all the UI interactions will be over SignalR.  New features which are part of this release are:
  • Server-side Blazor
  • Startup model aligned with ASP.NET Core
  • JavaScript interop improvements
  • Removed requirement to preregister JavaScript methods
  • Invoke .NET instance method from JavaScript
  • Pass .NET objects to JavaScript by reference
  • Add Blazor to any HTML file using a normal script tag
  • Render raw HTML
  • New component parameter snippet
  • Early support for in-browser debugging
Here is an official announcement.

Tuesday, July 17, 2018

Authentication using External Providers(Hotmail)

In my previous article, I wrote about how to authenticate by creating new user accounts. Now what if, anyone doesn’t want to add another pair of user id password to his memory and want to use the existing ones which he/she is using very frequently in his/her day-to-day life. Well, here comes the external providers in the picture.
In this article, I won’t be covering the basics on how to create a website from scratch as it is already covered in an earlier article. So, let’s quickly jump on to the login screen and on right hand side, you will see the text as ‘Use another service to log in.’ as shown in below image:




Above screenshot also provides a hyperlink, which will guide us on how to setup the authentication using external providers.
What are external providers?
There is a huge list of authentication providers. The most common one’s are Twitter, Facebook, Google and Microsoft. This list is not restricted till here as it can be any other custom provider. Throughout this article, I’ll be driving you to setup the authentication with Hotmail account.
Steps to setup authentication with Hotmail account
Navigate to https://apps.dev.microsoft.com and do login using existing Hotmail Id as shown below:










On successful login, you will land upon below page:




Next is to click on ‘Add an app’ button, which is shown on top right corner. This will take you to:
















In the above dialog, provide the application name and click on ‘Create’ button. Here you can also take a path of guidance by clicking on checkbox ‘Let us help you get started’. Once you click on Create button, an Application Id will be generated for you as shown below: 












Next, we have to work on adding application secrets.
Adding Application Secrets
Now click on ‘Generate New Password’ button. On click of this button, a password will be generated by you like shown below:














Copy this newly generated password and temporarily save it somewhere as you will need this password during the application configuration along with Application Id.
Adding Platform
Click on App platform on Registration screen. Here, for demo purpose I'm choosing Web. You can choose others too.
Next is to construct an URL, which is a combination of our application URL and signin host. This is what how it looks:





Click on the Save button and you are done with the configuration. Next, we have to associate this configuration with our application. So, let’s go ahead and quickly update our application using User Secrets as shown below: 





















and place the following code in secrets.json:

{
  "Authentication:Microsoft:ApplicationId": "654e030a-a10b-40ee-82db-1bf0185aebc0",
  "Authentication:Microsoft:Password": "XXXXXXXXXXX"
} 
 
Same lines of code you can write in Startup.cs also but we are maintaining the secrets in different file so that it can be changed easily while moving to production.
Next is to configure the identity in Startup.cs:

public void ConfigureServices(IServiceCollection services)
 {
       services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

       services.AddIdentity<ApplicationUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

       services.AddAuthentication().AddMicrosoftAccount(options => 
        {
                options.ClientId = Configuration["Authentication:Microsoft:ApplicationId"];
                options.ClientSecret = Configuration["Authentication:Microsoft:Password"];
         });

        services.AddMvc()
                .AddRazorPagesOptions(options =>
          {
                    options.Conventions.AuthorizeFolder("/Account/Manage");
                    options.Conventions.AuthorizePage("/Account/Logout");
            });
           
         services.AddSingleton<IEmailSender, EmailSender>();
 }
   
If you want to know more about setting up authentication, the official Microsoft article can also be referred.  
We are almost there. Save your application and click on Login button. You will notice that the Microsoft button is appearing on the right side. Click on that, provide your Hotmail credentials and on successful login you will land upon below screen:











On click of yes, below screen will be shown:





Quickly click on register and see the magic. You will notice that you are now logged in with your Hotmail id as shown below:



References
Whatever we did can also be done through a guided process which we came across during our configuration process in the form of a hyperlink. Additionally, you can also follow this link.
Hope you enjoyed learning.

Sunday, July 15, 2018

Received C# Corner MVP award


Today I’m so happy and excited to share with you all that I’ve received the Most valuable Professional (MVP) award from C# Corner for the second time. Last week, I received an email that I’ve been awarded this esteemed award for my community contributions.

Wednesday, July 4, 2018

Authentication in layman terms

Recently I met one of my readers and he asked me what is authentication and why is it required in very simple terms. So, here is the post.

What is Authentication?
To understand the fundamentals of authentication, let's begin by taking an easy example. You are working on some file and now you want to share that file to a person named XYZ over OneDrive. So, the purpose of authentication in this case is to make sure that only XYZ can access that document.

How to achieve it?
It can be achieved by setting up the authentication system and this system will tell who all can access this file based on some predefined rules. In our case, the rule is simple - none except XYZ should be able to access the file.

How verification happens?
Entire verification activity solely depends on our authentication system. When I'm saying authentication system, it means it is nothing but a piece of software written by someone. Now how will this piece of software validate the incoming user whether it is XYZ, ABC or someone else?

The most popular way to accomplish this is by using the login form wherein user will enter its identity in the form of login details.

Let's go in a bit formal way. 
Authentication is a process of identifying an entity using challenge response pattern.

Are Authentication and Identification same?
Not really. Authentication deals with only offering the challenge to the user, which is a login form in our case, whereas Identification deals with matching user claims, which can be name, DoB, etc.

Hope you got a fleeting idea on what is an authentication system. Happy learning!