如何让用户一次只能从一个设备登录

时间:2015-08-21 06:17:27

标签: android asp.net iphone c#-4.0 wcf-rest

我有一个RestAPI,当点击验证用户时。 这个api暴露给android和ios开发人员他们点击这个api以允许用户登录我们的应用程序

我的要求是这个.1)如果用户有手机说带有IMEI“abc1234”的abc电话。他从这部手机登录。现在,如果他试图从他的第二部手机登录,那么他不应该被允许从第二部手机登录。他应该先从abc设备注销。

现在几乎没有并发症 1)如果用户从abc登录。退出注销后,他会格式化手机或卸载应用程序。那我该如何处理来自同一设备或其他设备的登录。

基本上我想了解这类情景的策略或良好做法。

7 个答案:

答案 0 :(得分:14)

良好的做法是让用户从第二台设备登录并从第一台设备注销,从用户体验中获得更好,并且易于操作,例如

我从DeviceId A登录(在db中针对用户更新DeviceId) 然后我尝试从DeviceId B登录(再次更新DeviceId覆盖db中对用户的先前DeviceId)

现在如果我从DeviceId A发出请求,请匹配DB中的DeviceID,它将返回false。将用户发回登录页面。

答案 1 :(得分:2)



我建议您维护一个登录会话。只要成功登录,您就会向用户提供唯一的会话标识符。此会话ID随后可用于来自用户的进一步请求/呼叫。

对于用户从其他号码登录的情况,活动会话将此第二登录请求标记为无效。

保持每个会话的老化机制。这样,由电话断开或关闭引起的非活动会话将被终止。

答案 2 :(得分:1)

你好,你可以做一件事。跟踪用户登录状态。像

  1. 当用户登录时添加用户处于活动状态或登录
  2. 的条目
  3. 现在,当用户尝试使用其他设备登录时,请检查该用户是否已登录/处于活动状态。如果用户处于活动状态,则不允许他们登录并显示从旧设备注销的消息。您还可以从上次设备功能中进行自动注销。
  4. 当用户注销时,将用户状态激活/登录更改为非活动/注销,这样您就可以进行管理。
  5. 您必须在Android和网站中使用您的登录Web服务或API传递此用户状态,您可以直接从数据库中检查。

答案 3 :(得分:1)

使用SharedPreferences作为解决方案,

例如。

 public class Pref_Storage {
    private static SharedPreferences sharedPreferences = null;

    public static void openPref(Context context) {
        sharedPreferences = context.getSharedPreferences(context.getResources().getString(R.string.app_name),
                Context.MODE_PRIVATE);
    }

    public static void deleteKey(Context context, String key) {
        HashMap<String, String> result = new HashMap<String, String>();

        Pref_Storage.openPref(context);
        for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll()
                .entrySet()) {
            result.put(entry.getKey(), (String) entry.getValue());
        }

        boolean b = result.containsKey(key);
        if (b) {
            Pref_Storage.openPref(context);
            Editor prefsPrivateEditor = Pref_Storage.sharedPreferences.edit();
            prefsPrivateEditor.remove(key);

            prefsPrivateEditor.commit();
            prefsPrivateEditor = null;
            Pref_Storage.sharedPreferences = null;
        }
    }

    public static void setDetail(Context context, String key, String value) {
        Pref_Storage.openPref(context);
        Editor prefsPrivateEditor = Pref_Storage.sharedPreferences.edit();
        prefsPrivateEditor.putString(key, value);

        prefsPrivateEditor.commit();
        prefsPrivateEditor = null;
        Pref_Storage.sharedPreferences = null;
    }

    public static Boolean checkDetail(Context context, String key) {
        HashMap<String, String> result = new HashMap<String, String>();

        Pref_Storage.openPref(context);
        for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll()
                .entrySet()) {
            result.put(entry.getKey(), (String) entry.getValue());
        }

        boolean b = result.containsKey(key);
        return b;
    }

    public static String getDetail(Context context, String key) {
        HashMap<String, String> result = new HashMap<String, String>();

        Pref_Storage.openPref(context);
        for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll()
                .entrySet()) {
            result.put(entry.getKey(), (String) entry.getValue());
        }

        String b = result.get(key);
        return b;

    }
}

使用:

登录前请检查login_flag:

if (Pref_Storage.checkDetail(getApplicationContext(), "login_flag"))
{
    // Home Screen
}
else
{
    //Display Login Screen
}

登录后设置login_flag:

Pref_Storage.setDetail(getApplicationContext(), "login_flag", "0");

答案 4 :(得分:0)

尝试保存布尔变量。将标记为0并允许用户登录。 登录时,该值将更改为1,注销时将其更改回0。 只有当布尔字符的值为0时才允许用户登录。

答案 5 :(得分:0)

您可以使用SharedPreference在记录后存储用户登录详细信息,并在第二次运行应用程序时检查登录详细信息是否可用。注销后,您必须删除共享首选项。

有关详细信息,请访问以下链接:

http://www.tutorialspoint.com/android/android_shared_preferences.htm http://developer.android.com/reference/android/content/SharedPreferences.html

答案 6 :(得分:0)

php示例

用户成功登录时

var client = new RestClient(config.BaseUrl)
{
   Timeout = 4500,
   ReadWriteTimeout = 4500
};

var req = new RestRequest("personInformation");

req.AddQueryParameter("SSN", sweSsn);

if (!string.IsNullOrWhiteSpace(postalCode))
    req.AddQueryParameter("ZipCode", postalCode);

req.AddHeader("Package", "personadress");
req.AddHeader("Authorization", config.BasicAuthorization);

var resp = client.Get(req);

每当浏览器访问服务器总是比较$ t2> $ t1,如果没有发送浏览器消息“您正在注销”