Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 5 IoC and Authentication

I am just about to start on a project, where I will be using MVC5. But as I want to use IoC and later reuse my user tables, and add custom stuff to it, I am finding it very hard to see how I can use the new Identity framework that came with MVC5.

I am more and more looking towards basic forms auth. What are your solutions?

My needs:

  • User repository/service must be injected
  • User repository must reside in the DAL
  • User repository must be able to support other technologies than EF
  • Authentication with OpenID and OAuth must be somewhat easy to implement
  • MUST BE SECURE
  • Should be reusable in other projects, eg. WPF

I have been looking for a long time for an answer, but everything I see is hardcoded in the controller.

How are you solving this? Are you writing most from scratch, or can you bind into something that will scale to other .NET platforms as WCF and WPF?

The below code is taken directly from the AccountController in the default ASP.NET MVC 5 Template. The first thing it does is a Bastard Injection.

[Authorize]
public class AccountController : Controller
{
    public AccountController()
        : this(
            new UserManager<ApplicationUser>(
                new UserStore<ApplicationUser>(
                    new ApplicationDbContext())))
    {
    }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
    }
}

The accepted answer will go to the person, that shows me what they have done, that incorporates the above requirements

like image 758
André Snede Avatar asked Dec 02 '13 23:12

André Snede


People also ask

How to implement user authentication using MVC in ASP NET?

Select ASP.NET Application and name the project 3. Select MVC template 4. After loading the project , create a new folder DAL (Here we can call our custom implementation methods for User Authentication) 5. Now project structure looks like the below diagram in solution explorer

What is form authentication in MVC 5?

Form Authentication in MVC 5: Part 1. It assures that the correct user is authenticated or logged in for a specific service and the right service has been provided to the specific user based on their role that is nothing but authorization.

Is my MVC 5 application running successfully?

Congratulations, your MVC 5 application ran successfully. Click on restore down the browser page you can see like following: Because of the MVC 5 new feature Bootstrap. Several common authentication techniques are not secure on plain HTTP. Like basic authentication, forms authentication and unencrypted credentials.

How do I create a MVC application with azure identity?

Create a new ASP.NET Web project and select the MVC template. Web Forms also supports ASP.NET Identity, so you could follow similar steps in a web forms app. Leave the default authentication as Individual User Accounts. If you'd like to host the app in Azure, leave the check box checked.


1 Answers

Since this is .NET, the standard approach to security is to authenticate at the application boundary, and convert the authentication information into an IPrincipal. MVC supports this out of the box.

If you need other information gained during authentication, you can gather that at in the Composition Root and use it to compose your services.

As an example, imagine that you need the authenticated user's email address in a lower layer. Any class that requires the user's email address can simply request it as a Concrete Dependency:

public class EmailThingy
{
    private readonly string userEmail;

    public EmailThingy(string userEmail)
    {
        if (userEmail == null)
            throw new ArgumentNullException("userEmail");

        this.userEmail = userEmail;
    }

    // other members go here...
}

In ASP.NET MVC, the Composition Root is IControllerFactory. IIRC, you can pull the authentication data from within the CreateController method and use it to compose your object graph.

These days, I use IPrincipal in the same way: I inject it as a dependency, instead of relying on the Thread.CurrentPrincipal Ambient Context, because it's easier to unit test when everything is consistently injected via Constructor Injection.

like image 112
Mark Seemann Avatar answered Sep 23 '22 05:09

Mark Seemann