0

How to save user data in pure Web Api application, throughout the entire application life such as Session, So that on each request we can use the saved user data. I saw that in WEB API each request is separate and has no connection to the previous request and therefore can not use Session.

Can anyone help me?

2 Answers2

0

You need to install Microsoft.Owin from Nuget. Then Add this in your start up class.

public void ConfigureAuth(IAppBuilder app) 
        { 

            var OAuthOptions = new OAuthAuthorizationServerOptions 
            { 
                AllowInsecureHttp = true, 
                TokenEndpointPath = new PathString("/token"), 
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20), 
                Provider = new SimpleAuthorizationServerProvider() 
            }; 

            app.UseOAuthBearerTokens(OAuthOptions); 
            app.UseOAuthAuthorizationServer(OAuthOptions); 
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

            HttpConfiguration config = new HttpConfiguration(); 
            WebApiConfig.Register(config); 
        } 

        public void Configuration(IAppBuilder app) 
        { 
            ConfigureAuth(app); 
            GlobalConfiguration.Configure(WebApiConfig.Register); 
        }

Then need to add a provider like

[EnableCors(origins: "*", headers: "*", methods: "*")]  
    public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider  
    {  
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)  
        {  
            context.Validated(); //   
        }  

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)  
        {  
            var identity = new ClaimsIdentity(context.Options.AuthenticationType);  
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });  

            using (var db = new TESTEntities())  
            {  
                if (db != null)  
                {  
                    var empl = db.Employees.ToList();  
                    var user = db.Users.ToList();  
                    if (user != null)  
                    {  
                        if (!string.IsNullOrEmpty(user.Where(u => u.UserName == context.UserName && u.Password == context.Password).FirstOrDefault().Name))  
                        {  
                            identity.AddClaim(new Claim("Age", "16"));  

                            var props = new AuthenticationProperties(new Dictionary<string, string>  
                            {  
                                {  
                                    "userdisplayname", context.UserName  
                                },  
                                {  
                                     "role", "admin"  
                                }  
                             });  

                            var ticket = new AuthenticationTicket(identity, props);  
                            context.Validated(ticket);  
                        }  
                        else  
                        {  
                            context.SetError("invalid_grant", "Provided username and password is incorrect");  
                            context.Rejected();  
                        }  
                    }  
                }  
                else  
                {  
                    context.SetError("invalid_grant", "Provided username and password is incorrect");  
                    context.Rejected();  
                }  
                return;  
            }  
        }  
    }

You can add number of claim if you required. Then Modify your WebApiConfig public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services

        EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");  
        config.EnableCors(cors);  

        // Web API routes  
        config.MapHttpAttributeRoutes();  

        config.Routes.MapHttpRoute(  
            name: "DefaultApi",  
            routeTemplate: "api/{controller}/{id}",  
            defaults: new { id = RouteParameter.Optional }  
        );  

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();  
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();  
    }  
}

Then test your token like enter image description here

Then you pass your token by authorization header. Then get your claims.

Sample of api request enter image description here

Sample code for get claims data

var principal = this.Request.GetRequestContext().Principal as ClaimsPrincipal;
var claims = principal.Claims.ToList();
            var age = claims.FirstOrDefault(c => c.Type == "Age")?.Value;
Md. Abdul Alim
  • 707
  • 1
  • 6
  • 19
-1

You can use session variable such as:

Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

To use session variables :

// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;

For mor informations go to : MSDN

pov
  • 1
  • 1