2016-01-06 6 views
0

Следуя this blog и this answer, я получаю имя пользователя (что кажется правильным). Однако, когда я делаю звонок следующим образом, я получаю null.Не удается получить руководство текущего пользователя

MembershipUser uno = Membership.GetUser(); //null 
MembershipUser duo = Membership.GetUser(User.Identity.Name); // null 
bool   tri = User.Identity.IsAuthenticated; // true 
string   qua = User.Identity.AuthenticationType; // "ApplicationCookie" 

Пользователь определенно находится в БД, и я использовал стандартный модуль регистрации в шаблоне MVC.NET. Из-за требований в другом месте мне нужно создать фактическое руководство и не использовать имя пользователя.

Это часть моего Web.config, которая, как я подозреваю, может иметь значение. Я не большой по вопросам безопасности.

<system.web> 
    <authentication mode="None" /> 
    <compilation debug="true" targetFramework="4.5.2" /> 
    <customErrors mode="Off"></customErrors> 
    <httpRuntime targetFramework="4.5.2" /> 
</system.web> 
<system.webServer> 
    <modules> 
    <remove name="FormsAuthentication" /> 
    </modules> 
</system.webServer> 
+0

на основе предоставленной вами ссылки и кода, который вы опубликовали, где вы когда-либо получали руководство, например 'Guid guid = (Guid) Membership.GetUser(). ProviderUserKey;' – MethodMan

+0

@MethodMan Не уверен, что я следую вашему вопросу , Два первых объекта: * null *, поэтому невозможно получить какое-либо значение из свойства * ProviderUserKey *. –

+0

Если вы следуете примеру из ссылки в блоге, не знаете, почему он не работает для вас, у вас есть настройка членства правильно, что вы .config выглядят как [класс членства MSDN] (https://msdn.microsoft.com/en-us /library/system.web.security.membership.aspx) – MethodMan

ответ

0

Во-первых, так как вы используете безопасности из шаблона, вы не должны использовать Membership. То, что вам нужно получить, - это правильный тип личности, отбросив его до ClaimsIdentity. Затем у вас есть доступ ко всем претензиям для этого пользователя.

Существует способ получения имени и указателя текущего пользователя, и вы можете позволить intellisense направлять вас. Тем не менее, проблема безопасности еще важнее, поэтому, если вам интересно, продолжайте читать.


Есть претензии роли, идентификатор пользователя, поставщика безопасности и т.д. Так как все те, собраны в одном списке, вам нужно отфильтровать те, которые уместны в вашем случае. В качестве справки у вас есть строковые поля, например. RoleClaimType и NameClaimType для обычно запрашиваемых претензий.

var identity = User.Identity as ClaimsIdentity; 
var roles = identity.Claims 
    .Where(c => c.Type == identity.RoleClaimType) 
    .Select(c => c.Value); 

Кроме того, обратите внимание, что в основных случаях (с одной идентичности для претензий), есть ClaimsPrincipal, который более recommneded применять (он также имеет Claims свойство).

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