With policies we don’t need to hard code anymore Roles or Names in our Authorize attribute. A policy is an authorization logic that contains one of more requirements.
How to use a policy?
The concept is very simple, once we have a defined policy we can add it to our Authorize attributes…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
We have to define our policies in our Startup class, in ConfigureServices. We need a policy name, a list of valid authentication schemes and a list of requirements.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
To write our requirement we use the base class AuthorizationHandler and implement the interface IAuthorizationRequirement.
This requirement checks that the user is authenticated and has the claim “MonsterTypeClaim” = “Good”
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The goal of this post is to set up a Visual Studio 2015 project with ASP NET Core 1 and Angular 2Typescript that can be used as a template for all my projects.
We will use npm (Node Package Manager) to add our dependencies and we will configure the typescript transpiler integrated in Visual Studio. We will also configure a gulp task to bundle our javascript an css dependencies.
Content
Introduction
Install Pre-requisites
Create an empty ASP Core 1 project
Auto transpile Typescript after save
Add Angular 2 with npm
Set up gulp task to bundle dependencies
Introduction
The former ASP.NET 5 was renamed to .NET Core 1. It is a modular Microsoft runtime library implementation that includes a subset of the .NET Framework.
.NET Core 1 was written from scratch. It has a lot of advantages, for example it is lighter, open-source and multi-platform: Mac, Linux and Windows.
Although the version 1 is in Release Candidate there are some ASP.NET 4.6 features missing, like SignalR.
It is up to you to choose a mature Framework like ASP.NET 4.6 or a modern one like ASP.NET Core 1… you can read more about it in this post by Scott Hanselman. I copied the following diagram from that post :-).
Install Pre-requisites
There are some problems in Windows using npm version 2. It nest dependencies and ends up having too long paths for Windows. Let’s start updating npm to version 3 and configuring Visual Studio to use it.
The first thing that we should do is to install Python version 2.7.X and NodeJS version 4.2.X. Remember the path where you install NodeJS, we will need it later.
Open visual studio and add the path where NodeJS is installed as the first path to look for external tools (at the top). The next time that Visual Studio has to restore a node package it will start looking for nodejs.exe in that path. The version we just installed will be found and used.
Create an empty ASP NET Core 1 project
Let’s create our project and configure a very simple server-side code.
In Visual Studio 2015 Update 1 ASP NET Core 1 is still called ASP NET 5. Create a new project and select the WebAPI template. Our project will have a SPA that will call a WebAPI controller to get a message.
Delete the Project_Readme.html and update the values controller with this simple WebAPI controller that returns a hello message and the server UTC Time:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
We will call this method later from angular to check that the communication between our SPA and the server works. For now we can call it from the browser to check it. Run the application and write something like this in your browser using your configured port:
The file Startup.cs contains the configuration of the middleware. We will see in a future post how it works and how to configure it to use features like authentication. The default configuration when you select a WebAPI project template is ok for us.
Auto transpile Typescript after save
We can tell Visual Studio to auto transpile always that we edit and save a typescript file enabling:
“Automatically compile TypeScript files which are not part of a project”
Our files will be part of the project… but this is an easy way to make Visual Studio auto transpile. Running typescript compiler in watch mode is an alternative… but I like this solution because I have everything integrated in Visual Studio.
If you know a better way please leave me a comment. 🙂
We will have a tsconfig.json file on the project root of our project to configure typescript, Visual Studio will use that file and not the settings that we configure in Options:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The application that we will use as an example will be a simple application that call the server to get a message and will display using Angular 2.
Let’s add Angular 2 and other dependencies to npm, we need a file called “package.json” on the root of our project:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Save the file and Visual Studio will create node_modules folder and download all dependencies for you.
It is out of the scope of this post to explain how Angular 2 works you can read more about it here. But basically we define a component that we can use in our index.
<hello></hello>
This component is a html view that has bindings to its code behind or “view-model”.
hello.view.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The hello.component uses the service hello.service that makes REST calls to the server and returns Observable<T>.
hello.service.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
We need to “start” / “bootstrap” our application. We will use System.JS to do that. This is this index.html where we “start” our Angular 2 app:
index.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Our index.html only references a style.css and a deps.js file. Those files are a bundle with all our dependencies. To create that bundle we will use gulp. We need this gulpfile.js on the root of our project:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
We want to create our bundles automatically when we rebuild or clean the project (not in every build).
Open Task Runner Explorer and bind the clean and bundle tasks to the “Clean” Visual Studio event:
This will trigger our tasks always that we clean or rebuild our solution. You can also add the bundle task to the “Before Build” event… but it can takes 8-10 seconds and normally the dependencies are not changing in every build.
We have a pre-configured project that hopefully will save us some time in the future!
If you know how to make it better please leave me a comment!
Swift extensions add new functionality to an existing class, structure, enumeration, or protocol type.
In this example we will see how to write a UIViewController extension to show loading indicators and alerts.
To add a class extensions we have to write something like:
extension UIViewController {
// write your extensions here
}
Show a loading indicator
Our first extension method will be a method that should show a loading indicator and disable the application so that the user cannot interact with it. To help the user understand that the application is disabled it should be grayed out.
To use this method we don’t need any parameter but we need a reference to the created indicator to hide it later:
var spinner = self.showModalSpinner()
To do this we can use the class UIActivityIndicatorView.
/**
Shows a loading indicator and disables user interaction with the app until it is hidden
*/
func showModalSpinner() ->UIActivityIndicatorView{
// user cannot interact with the app while the spinner is visible
UIApplication.sharedApplication().beginIgnoringInteractionEvents()
var indicator = UIActivityIndicatorView()
indicator = UIActivityIndicatorView(frame: self.view.frame)
indicator.center = self.view.center
indicator.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
indicator.hidesWhenStopped = true
indicator.startAnimating()
self.view.addSubview(indicator)
return indicator
}
Now we need a method to hide the spinner when our task was completed:
self.hideModalSpinner(self.spinnerView)
/**
Hides the loading indicator and enables user interaction with the app
*/
func hideModalSpinner(indicator: UIActivityIndicatorView){
indicator.stopAnimating()
indicator.hidden = true
// user can interact again with the app
UIApplication.sharedApplication().endIgnoringInteractionEvents()
}
If we put these two methods within a UIViewController extension we can use them like a normal method of the class.
Show an alert
Let’s add now a method to our extension to show an alert to the user, it should have an ‘ok’ button that will close the alert when the user taps it.
I would like to have a very simple method that has only two parameters to indicate the title and message:
self.showAlert("Error", message: "Invalid user name / password.")
We can use the class UIAlertController to do that:
/**
Shows an alert with a title and a message
*/
func showAlert(title: String, message:String) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
// show the alert with a "ok" button that will close the alert
let okAction = UIAlertAction(title: "ok", style: UIAlertActionStyle.Default) { (action) -> Void in
self.dismissViewControllerAnimated(true, completion: nil)
}
alertController.addAction(okAction)
// show alert controller
self.presentViewController(alertController, animated: true, completion: nil)
}
Complete example:
import UIKit
extension UIViewController{
/**
Shows an alert with a title and a message
*/
func showAlert(title: String, message:String) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
// show the alert with a "ok" button that will close the alert
let okAction = UIAlertAction(title: "ok", style: UIAlertActionStyle.Default) { (action)-> Void in
self.dismissViewControllerAnimated(true, completion: nil)
}
alertController.addAction(okAction)
// show alert controller
self.presentViewController(alertController, animated: true, completion: nil)
}
/**
Shows a loading indicator and disables user interaction with the app until it is hidden
*/
func showModalSpinner()->UIActivityIndicatorView{
// user cannot interact with the app while the spinner is visible
UIApplication.sharedApplication().beginIgnoringInteractionEvents()
var indicator = UIActivityIndicatorView()
indicator = UIActivityIndicatorView(frame: self.view.frame)
indicator.center = self.view.center
indicator.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
indicator.hidesWhenStopped = true
indicator.startAnimating()
self.view.addSubview(indicator)
return indicator
}
/**
Hides the loading indicator and enables user interaction with the app
*/
func hideModalSpinner(indicator: UIActivityIndicatorView){
indicator.stopAnimating()
indicator.hidden = true
// user can interact again with the app
UIApplication.sharedApplication().endIgnoringInteractionEvents()
}
}