2015-09-12 3 views
1

Я работаю над написанием простой страницы входа + чата для SignalR для моего сайта с vNext beta8. К сожалению, мне очень сложно понять, как работают утверждения и аутентификация.Context.User всегда null с базовой аутентификацией в ASP.NET vNext

Все, что я пытаюсь сделать, это аутентифицировать пользователя и установить Context.User на их личность, поэтому к нему можно получить доступ в SignalR. Так как у меня есть это сейчас, то Context.User везде нулевое, поэтому SignalR даже не является мясом этого вопроса.

Вот соответствующие биты кода для этой проблемы:

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddSession(); 
    services.AddCaching(); 
    services.AddSignalR(); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    app.UseStaticFiles(); 
    app.UseSession(); 
    app.UseMvc(routes => 
    { 
     routes.MapRoute(
      name: "default", 
      template: "{controller}/{action}/{id?}", 
      defaults: new { controller = "Home", action = "Index" }); 
    }); 
    app.UseSignalR(); 
} 

Войти метод управления Web API со значениями по умолчанию при условии, прыгая пароля/проверки подлинности и настройки сеанс, который работает. LoginUserInfo лишь небольшой класс, чтобы получить имя пользователя/пароль для входа в систему

[HttpPost] 
public string Login(LoginUserInfo info) 
{ 
    kUser user = new kUser(); 
    user.Name = "Test user"; 

    //This is where I am completely missing the point of something 
    Context.User = new ClaimsPrincipal(user); 
} 

KUser. - этот класс является неполным, я предполагаю, что AuthenticationType и IsAuthenticated не приходят в аффект здесь, так как исключение никогда не выбрасывается.

[Serializable] 
public class kUser : IIdentity 
{ 
    public ObjectId Id { get; set; } 
    public string Name { get; set; } 

    public string AuthenticationType 
    { 
     get { return "MongoDB"; } 
    } 

    public bool IsAuthenticated 
    { 
     get 
     { 
      //If ID exists in database 
      throw new NotImplementedException(); 
     } 
    } 
} 

Исследование приводит меня к разным для выполнения установки Context.User и с ее доступной по всему приложению. Некоторые руководства указывают на FormsAuthentication, который, похоже, не существует в ASP.NET 5, некоторые говорят о настройке идентификаторов пользователей для каждого потока и некоторые детали, как написать весь поставщик услуг для аутентификации.

Все, что я хочу, - это чрезвычайно простая процедура входа в систему - не помню стильные куки-файлы, ничего необычного. Просто введите имя пользователя/пароль, и сервер запоминает вас для вашей сессии. Где я ошибаюсь, и чего мне не хватает?

ответ

2

Вам нужно сделать что-то вроде этого

var claims = new[] { new Claim("name", authUser.Username), new Claim(ClaimTypes.Role, "Admin") }; 
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); 
Context.Authentication.SignIn(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity)); 

Больше деталей - https://github.com/anuraj/CookieAuthMVCSample

Я не проверил код с последним выполнением.

+0

Это прекрасно работает, и большое спасибо за пример! – Scott

+0

Просто для использования в будущем, 'Context.Authentication.SignIn' был заменен на' Context.Authentication.SignInAsync', но он используется так же, как этот пример. – Scott

+0

Правда, я не проверил код с последней версией. – Anuraj

Смежные вопросы